首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写多个sed命令的更简洁的方法?

编写多个sed命令的更简洁的方法?
EN

Stack Overflow用户
提问于 2014-04-29 16:11:19
回答 7查看 2.8K关注 0票数 11

是否有更枯燥的方法来编写以下命令(将它们放入bash脚本中):

代码语言:javascript
复制
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
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-04-29 16:15:53

由于要匹配的模式是相似的,所以您可以对这4个字符串使用交替并捕获它。使字符串开头的#可选。

以下将把这些合并为一个:

代码语言:javascript
复制
sed -i -r 's/^#?(PermitRootLogin|PermitEmptyPasswords|PasswordAuthentication|X11Forwarding) yes/\1 no/' /etc/ssh/sshd_config

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

代码语言:javascript
复制
sed -i 's/^#\{0,1\}\(PermitRootLogin\|PermitEmptyPasswords\|PasswordAuthentication\|X11Forwarding\) yes/\1 no/' /etc/ssh/sshd_config
票数 12
EN

Stack Overflow用户

发布于 2014-04-29 16:34:38

或者在一次调用-e 'sed-command'时使用多个sed参数

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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/

然后使用该文件运行sed

代码语言:javascript
复制
sudo sed -i.bak -f sed.script /etc/ssh/sshconfig

我在-i选项中添加了一个备份扩展。你是一个勇敢的人比我,如果你编辑主要配置文件,而不做备份的副本,首先!(如果您在Mac或BSD上工作,也是必要的;那里的sed需要一个带有-i的扩展。)

票数 11
EN

Stack Overflow用户

发布于 2014-04-29 16:12:50

您可以使用-e

代码语言:javascript
复制
sudo sed -i -e 'first_command' -e 'second command' ... -e 'last command' /etc/ssh/sshd_config
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23369917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档