Text-Processing
替換特定的線路保持標識
我有一個帶有縮進的文件。
我想替換特定行但保留縮進。
該文件有一行如
\t\t customerId = "123" // has indentation in the start of line
我正在執行這個:
sed -e 's:^\s*customerId = "'${OLD_ID}'": customerId = "'${NEW_ID}':' file
這沒有任何作用。我也知道,即使它有效,我也會弄亂縮進。我怎樣才能解決這個問題?
**注意:**解決方案不一定是,
sed
但我希望它能夠跨平台更新
測試@Gilles Quenot 答案:
OLD_ID="1234" NEW_ID="5678" sed -E -i.bk "s:^(\s*)versionName = \"$OLD_ID\":\1versionName = \"$NEW_ID\":" testfile
樣品測試:
name="Jim" customerId = "1234"
號碼未被替換
使用標準
sed
:sed "s:^\([[:blank:]]*customerId = \)\"$OLDID\":\1\"$NEWID\":" file
該
[:blank:]
模式將匹配單個空格或製表符。該
sed
表達式擷取行中的所有內容,直到 ID 本身,並將其替換為擷取的內容和新 ID。稍微好看點,可能
sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":\1"'"$NEWID"'":' file
測試:
$ cat file name="Jim" customerId = "1234" $ OLDID=1234 $ NEWID=321 $ sed 's:^\([[:blank:]]*customerId = \)"'"$OLDID"'":\1"'"$NEWID"'":' file name="Jim" customerId = "321"
如果周圍的空格
=
是可選的,您可能需要使用sed 's:^\([[:blank:]]*customerId *= *\)"'"$OLDID"'":\1"'"$NEWID"'":' file
don_crissti 在評論中建議的另一種方法:
sed '/customerId *=/s/"'"$OLDID"'"/"'"$NEWID"'"/' file
這樣做的好處是它不需要擷取組。這將查找包含單詞
customerId
後跟等號的行並替換這些行上的 ID。