我已经研究了一些与使用替换字符串相关的其他问题sed
,但我无法弄清楚如何将其应用于我的特定需求。
在像下面的代码片段这样的情况下,我只想更改不以“#”开头的行上的字符串:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="string"
PKG_DESC="string-foo"
我希望输出如下所示:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="newString"
PKG_DESC="newString-foo"
根据我收集的信息,我认为我可以使用 find 和 sed 更改所有文件中的所有字符串
find . -type f -exec sed -i 's/string/newString/g' {} +
但我只是无法弄清楚如何为以“#”开头的行添加例外。我对 sed 之外的其他方法持开放态度,因此如果有更简单的方法,请随时分享。
看完之后如何仅替换 sed 中与多个模式匹配的行?,我了解了如何在行以某种模式开头的情况下更改字符串,但我需要的是更改模式所在的行不是成立。
答案1
sed
如果发现带有感叹号的模式,您可以停止执行操作:
sed '/#/!s/string/replacement/' file
即对于匹配“#”的行(在任何位置)不进行替换 - 否则进行替换。在你的情况下结果是:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="replacement"
PKG_DESC="replacement-foo"
要仅跳过以 hash 开头的行,请将正则表达式更改为:
sed '/^#/!s/string/replacement/' file
请注意,行尾带有注释的行也会将更改应用于注释部分,而在上面的示例中,这些行根本不会更改(包括代码部分)。
答案2
您想要更改这些没有#
字符的行中的“字符串”或者该字符位于“string”之后,以便您可以在行尾添加注释:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="string"
PKG_DESC="string-foo"
PKG_A="string" # this is comment after string
为了正确运行
sed 's/^\([^#]*\)string/\1newString/' file
结果:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="newString"
PKG_DESC="newString-foo"
PKG_A="newString" # this is comment after string