我正在使用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 \,这会导致所有替换失败。
对于这样的文件:
# 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
开关。对结果满意时可以添加它。