使用sed查找字符串并替换该行,但忽略注释掉的行

问题描述 投票:-1回答:1

我正在使用sed在具有不同配置的300个Linux VM上编辑我的/etc/samba/smb.conf文件。

我只想搜索未注释的“服务器字符串=”行,并用“服务器字符串= $ VARIABLE SAMBA”替换整行,这将在读取我的服务器列表时从do-while循环中获取VARIABLE。

所以尝试完成3件事1-查找“服务器字符串=并将该行替换为服务器字符串= $ VARIABLE”

      sed -i '/server string \=/c\server string = '$VARIABLE' SAMBA' /etc/samba/smb.conf

上面的命令有效,但不幸的是,我的许多机器上仍然有解释性注释,其中也包含“服务器字符串=”,我注意到未注释的“服务器字符串=“行并不总是在第1列中,并且经常在空格或制表符中在较旧的文件上,所以我不能仅以^作为开头。

这是我在读取堆栈溢出时读取其他线程并将合并替换行语法(\ c)与忽略注释行语法(^#/!/)组合而成的命令,但这并不令人满意。我从另一篇文章中添加了\ v来表示“魔术替换”,因为弄清楚需要逃避的确切内容使我难以理解。 (我认为^和=需要转义)

      sed -i -e '/^#/!s/\vserver string =/c\server string = '$VARIABLE' SAMBA/g' /etc/samba/smb.conf

此行现在似乎根本不为我做任何事情...无替代项,无变量替代项。

如果我用grep表示“服务器字符串=“,我会看到:(不,我不能手动更改所有308台机器,但都一样)]

# server string = is the equivalent of the NT Description field
   server string = 145000web SAMBA ---- THIS LINE WAS NOT REPLACED ----

我为此尽全力。

-----------------------------

使用第一个评论提供的链接,我得到了这个:

sed '/^#/!s/test/TEST/g' file.txt - This command works as expected ignoring the commented out lines and replacing the text.

不幸的是试图添加c \来替换整行都出错了:

cTEST
# test
# test
cTEST
a cTEST to find cTEST

3条未注释的行应该只说测试我尝试在s /之后使用c \,这会导致所有替换失败。

search sed replace ignore
1个回答
0
投票

对于这样的文件:

# server string = is the equivalent of the NT Description field
   server string = 145000web SAMBA1
#server string = is the equivalent of the NT Description field
       server string = 999999web2 SAMBA2
#   server string = another comment
#          server string = more comments
server string = some value SAMBA3
 server string = some value SAMBA4

以及带有这样的变量

echo $variable
111111www5

这将与gnu sed一起工作,但是空白不保留:

sed 's/^[^#]*server string \=.*/server string = '"$variable"' SAMBA/g' file
# server string = is the equivalent of the NT Description field
server string = 111111www5 SAMBA
#server string = is the equivalent of the NT Description field
server string = 111111www5 SAMBA
#   server string = another comment
#          server string = more comments
server string = 111111www5 SAMBA
server string = 111111www5 SAMBA

要保留空白,您可以使用类似以下的内容:

sed -r 's/(^[^#]*)server string \=.*/\1server string = '"$variable"' SAMBA/g' file

甚至

sed -r 's/(^[^#]*server string \=).*/\1'"$variable"' SAMBA/g' file

PS:我故意省略了-i开关。对结果满意时可以添加它。

© www.soinside.com 2019 - 2024. All rights reserved.