我有一个有缩进的文件。
我想替换特定行但保留缩进。
该文件有一行,例如
\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