【发布时间】:2020-02-27 04:23:44
【问题描述】:
我正在使用 sed 在 300 个不同配置的 Linux 虚拟机上编辑我的 /etc/samba/smb.conf 文件。
我只想搜索未注释的“server string =”行,并将整行替换为“server string = $VARIABLE SAMBA”,它在读取我的服务器列表时从 do-while 循环中获取 VARIABLE。
所以尝试完成 3 件事 1 - 找到 "server string =" 并将该行替换为 Server string = $VARIABLE"
sed -i '/server string \=/c\server string = '$VARIABLE' SAMBA' /etc/samba/smb.conf
上面的命令有效,但不幸的是,我的很多机器仍然有解释 cmets,其中还包括“server string =”,我注意到未注释的“server string =”行并不总是在第 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 行应该只是说 TEST 我尝试在 s/ 之后使用 c\,这会导致所有替换失败。
【问题讨论】:
-
我认为这篇文章可能会有所帮助。 stackoverflow.com/questions/4798149/…
-
那是我用来忽略注释行的帖子......显然我以某种方式误解了语法。