如何替换文件中的字符串(以 # 开头的行除外)

如何替换文件中的字符串(以 # 开头的行除外)

我已经研究了一些与使用替换字符串相关的其他问题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

相关内容