Text-Processing

替換特定的線路保持標識

  • October 29, 2020

我有一個帶有縮進的文件。

我想替換特定行但保留縮進。

該文件有一行如

  \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。

引用自:https://unix.stackexchange.com/questions/434073