sed替换conf 2不同的模式

时间:2013-07-17 12:33:49

标签: bash shell

我想用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

3 个答案:

答案 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