4

我想用 sed 替换 conf 文件中的 2 个条目

# 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 种不同的模式来检查“server”和“next_server”

我也想知道如何更改带引号的字符串模式

#change default password    
/bin/sed -i 's/default_password_crypted: "$1$mF86/UHC$WvcIcX2t6crBz2onWxyac."/default_password_crypted: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/' /etc/cobbler/settings

谢谢

4

3 回答 3

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
于 2013-07-17T12:38:37.923 回答
1

如果您的行server: 127.0.0.1中没有多余的空格或其他字符串,则应添加^and $

/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
于 2013-07-17T12:59:10.297 回答
0

^只需在您的正则表达式的开头添加 a即可要求该行以该字符串开头。

# 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
于 2013-07-17T13:02:12.547 回答