替换特定行并保留标识

替换特定行并保留标识

我有一个有缩进的文件。
我想替换特定行但保留缩进。
该文件有一行,例如

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

号码未更换

答案1

使用标准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。

答案2

sed -E "s:^(\s*)customerId = \"$OLD_ID\":\1customerId = \"$NEW_ID\":" file

相关内容