更清洁的方式来编写多个sed命令?

use*_*544 11 linux bash shell ubuntu sed

是否有更多的DRY方式来编写以下命令(将它们放在bash shell脚本中):

sudo sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

sudo sed -i 's/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sudo sed -i 's/PermitEmptyPasswords yes/PermitEmptyPasswords no/' /etc/ssh/sshd_config

sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

sudo sed -i 's/^#X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
sudo sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

dev*_*ull 12

由于要匹配的模式类似,您可以使用4个字符串的替换并捕获它.使#字符串的开头可选.

以下将这些组合成一个:

sed -i -r 's/^#?(PermitRootLogin|PermitEmptyPasswords|PasswordAuthentication|X11Forwarding) yes/\1 no/' /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

如果您的版本sed不支持扩展正则表达式,您可以说:

sed -i 's/^#\{0,1\}\(PermitRootLogin\|PermitEmptyPasswords\|PasswordAuthentication\|X11Forwarding\) yes/\1 no/' /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 10

-e 'sed-command'在单个调用中使用多个参数sed:

sudo sed -i.bak \
         -e 's/^#PermitRootLogin yes/PermitRootLogin no/' \
         -e 's/PermitRootLogin yes/PermitRootLogin no/' \
         -e 's/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/' \
         -e 's/PermitEmptyPasswords yes/PermitEmptyPasswords no/' \
         -e 's/^#PasswordAuthentication yes/PasswordAuthentication no/' \
         -e 's/PasswordAuthentication yes/PasswordAuthentication no/' \
         -e 's/^#X11Forwarding yes/X11Forwarding no/' \
         -e 's/X11Forwarding yes/X11Forwarding no/' \
         /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

或者创建一个脚本文件sed.script,其中包含以下命令:

s/^#PermitRootLogin yes/PermitRootLogin no/
s/PermitRootLogin yes/PermitRootLogin no/
s/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/^#PasswordAuthentication yes/PasswordAuthentication no/
s/PasswordAuthentication yes/PasswordAuthentication no/
s/^#X11Forwarding yes/X11Forwarding no/
s/X11Forwarding yes/X11Forwarding no/
Run Code Online (Sandbox Code Playgroud)

然后sed使用该文件运行:

sudo sed -i.bak -f sed.script /etc/ssh/sshconfig
Run Code Online (Sandbox Code Playgroud)

我已经为该-i选项添加了备份扩展.如果您编辑主要配置文件而不先制作备份副本,那么您就比我更勇敢!(如果你在Mac OS X或BSD上工作也是必要的; sed那里需要扩展名-i.)