我想用sed
替换conf文件中的2个entr# Set Server
/bin/sed -i 's/server: 127.0.0.1/server: xxx.xxx.xxx.xxx/' /etc/cobbler/settings
# Set next Server
/bin/sed -i 's/next_server: 127.0.0.1/next_server: 192.168.122.1/' /etc/cobbler/settings
由于某种原因,它改变了两者的主要条目,为什么?我使用2种不同的模式来检查"服务器" &安培; " next_server"
我也想知道如何更改引用的字符串模式
#change default password
/bin/sed -i 's/default_password_crypted: "$1$mF86/UHC$WvcIcX2t6crBz2onWxyac."/default_password_crypted: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/' /etc/cobbler/settings
THX
答案 0 :(得分:1)
这是因为您的第一个匹配的正则表达式是:
server: 127.0.0.1
第二个是:
next_server: 127.0.0.1
正如您所看到的,首先正则表达式将匹配两种模式,因为在这两种情况下都找到server: 127.0.0.1
。
修复:为避免不必要的匹配,您需要使用字边界,如下所示:
sed -i.bak 's/\b\(server: \)127.0.0.1/\1xxx.xxx.xxx.xxx/' /etc/cobbler/settings
注意:在OSX上,您需要对字边界使用这种奇怪的语法:
sed -i.bak 's/[[:<:]]\(server: \)127.0.0.1/\1xxx.xxx.xxx.xxx/' /etc/cobbler/settings
答案 1 :(得分:1)
如果您的行server: 127.0.0.1
在行中没有多余的空格或其他字符串,
您应该添加^
和$
。
/bin/sed -i 's/^server: 127.0.0.1$/server: xxx.xxx.xxx.xxx/' /etc/cobbler/settings
还有第二个问题,你需要逃避$
。
/bin/sed -i 's;default_password_crypted: "\$1\$mF86/UHC\$WvcIcX2t6crBz2onWxyac.";default_password_crypted: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";' /etc/cobbler/settings
答案 2 :(得分:0)
只需在正则表达式的开头添加^
即可要求该行以该字符串开头。
# Set Server
/bin/sed -i 's/^server: 127.0.0.1/server: xxx.xxx.xxx.xxx/' /etc/cobbler/settings
# Set next Server
/bin/sed -i 's/^next_server: 127.0.0.1/next_server: 192.168.122.1/' /etc/cobbler/settings