在bash脚本

时间:2017-01-17 20:16:18

标签: linux bash replace sed

我试图在脚本中修改我的linux机器上的某个文件。该文件是/etc/pam.d/login文件。问题是文件的内容是,

# Prints the message of the day upon succesful login. 
# (Replaces the `MOTD_FILE' option in login.defs)
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
session    optional   pam_motd.so  motd=/run/motd.dynamic noupdate
session    optional   pam_motd.so

我需要注释掉这个文件中的第二个会话行但是当我去字符串匹配时,结果如下(我正在使用SED为感兴趣的人这样做)。

# Prints the message of the day upon succesful login.
# (Replaces the `MOTD_FILE' option in login.defs)
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
#session    optional   pam_motd.so  motd=/run/motd.dynamic noupdate
#session    optional   pam_motd.so

因为第一行也符合条件。我如何确保整行匹配"会话可选pam_motd.so"而不只是它的某个部分。

谢谢!

2 个答案:

答案 0 :(得分:7)

您需要在正则表达式中使用行开头(^)和行结束($)。像:

sed -i '/^session    optional   pam_motd.so$/s/^/#/' /path/to/file

答案 1 :(得分:1)

使用^$锚来限制您的匹配:

sed 's/\(^session    optional   pam_motd.so$\)/#\1/' file > file.new