Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 编写多个sed命令的更简洁的方法?_Linux_Bash_Shell_Ubuntu_Sed - Fatal编程技术网

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

Linux 编写多个sed命令的更简洁的方法?,linux,bash,shell,ubuntu,sed,Linux,Bash,Shell,Ubuntu,Sed,是否有更简单的方法来编写以下命令(将它们放入bashshell脚本中): 您可以使用-e: sudo sed -i -e 'first_command' -e 'second command' ... -e 'last command' /etc/ssh/sshd_config 因为要匹配的模式是相似的,所以可以对4个字符串使用交替并捕获它。将字符串开头的#设置为可选 以下内容将这些内容合并为一个: sed -i -r 's/^#?(PermitRootLogin|PermitEmptyPas

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


您可以使用
-e

sudo sed -i -e 'first_command' -e 'second command' ... -e 'last command' /etc/ssh/sshd_config

因为要匹配的模式是相似的,所以可以对4个字符串使用交替并捕获它。将字符串开头的
#
设置为可选

以下内容将这些内容合并为一个:

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

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

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

就像我说的,你也可以使用for循环

#!/bin/bash FILE='/etc/ssh/sshd_config' REPLACE_STRINGS=('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/') for i in "${REPLACE_STRINGS[@]}" { sudo sed -i "$i" $FILE } #!/bin/bash 文件='/etc/ssh/sshd_config' 替换字符串=('s/^#permitrotlogin yes/permitrotlogin no/'s/permitrotlogin yes/permitrotlogin no/'s/^ permitrotlogin no/'s/permitrotlogin yes/permitrotlogin no/'s/^密码验证yes/password验证no/'s/PasswordAuthentication yes/PasswordAuthentication no/'s/'s/'s/'s/'s/^ X11Forwarding yes/X11Forw编号/“s/X11正向是/X11正向否/”) 对于“${REPLACE_STRINGS[@]}”中的i { sudo sed-i“$i”$文件 }
在一次调用
sed
中使用多个
-e“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
或者创建一个脚本文件,
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/
然后使用该文件运行
sed

sudo sed -i.bak -f sed.script /etc/ssh/sshconfig

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

您可以将sed命令放在外部文件中:

sudo sed -i -f commands.sed /etc/ssh/sshd_config

commands.sed:
s/#*PermitRootLogin yes/PermitRootLogin no/
s/#*PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/#*PasswordAuthentication yes/PasswordAuthentication no/
s/#*X11Forwarding yes/X11Forwarding no/
您还可以在bash脚本中嵌入多行sed脚本:

#!/bin/bash

sudo sed -i '
    s/#*PermitRootLogin yes/PermitRootLogin no/
    s/#*PermitEmptyPasswords yes/PermitEmptyPasswords no/
    s/#*PasswordAuthentication yes/PasswordAuthentication no/
    s/#*X11Forwarding yes/X11Forwarding no/
' /etc/ssh/sshd_config
在标准unix上(当sed是posix而不是GNU时)


正常情况下,这没关系,但行有时定义为以#than单词开头,有时没有指定位置,因此
permitrotlogin
替换也会更改
specialpermitrotlogin

懒惰,但我会这样做:

sed -Ei 's/.*PermitRootLogin yes|#PermitRootLogin no/PermitRootLogin no/g' /etc/ssh/sshd_config
sed -Ei 's/.*PermitEmptyPasswords yes|#PermitEmptyPasswords no/PermitEmptyPasswords no/g' /etc/ssh/sshd_config
sed -Ei 's/.*PasswordAuthentication yes|#PasswordAuthentication no/PasswordAuthentication no/g' /etc/ssh/sshd_config
sed -Ei 's/.*X11Forwarding yes|#X11Forwarding no/X11Forwarding no/g' /etc/ssh/sshd_config
~SimonTek

只是一个小小的评论

提出了漂亮的解决方案

我们不必在一行中写两次同一个字符,我们可以将其修改为

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

此方法将减少基于打字错误和文件的错误。并使用sed匹配表达式。尝试“man-sed”。您也可以使用for循环和列表,因为您总是访问同一个文件。该列表将包含所有不同的替换字符串。@keyser如果没有
-r
的话,
和括号就没有什么特别之处,也就是说,您需要对它们进行转义。@keyser还添加了一个没有
-r
的变体。关于n它的优点是它确实有效。否则,它就不能被推荐。我冒昧地在你的答案中修正了一些东西。如果你有任何异议,请随时回复。这比使用单个
sed
调用要差。@jonathanLeffler我同意你的答案更有效,但对我来说,游戏的名称是reada可扩展性。对于带有列表的循环来说,更具可读性,这只是我的偏好。在我这个年龄,由于我的思维能力不强,我记不起所有不同命令的所有更复杂的语法。进一步的辩论就如同在C中争论在何处放置大括号一样。你可以使用
\?
或者,如果你的
sed
方言不支持这一点,也许
\*
@tripleee:是的,有一些方法可以修改正则表达式,包括使用
^\{0,1\}
,但有时,更容易让人们以更简单(如果更详细)的方式编写替代命令,从而为他们生成更可靠的脚本。随着他们对更复杂的正则表达式的适应度越来越高,他们可以减少脚本的内容。但是知道
sed
可以对脚本文件或多个进行操作de>-e参数(或单个多行
-e
参数)是此处的关键信息。是的,这是正确的。我想知道@fedorqui为什么选择使用
-e
删除答案。
sed -Ei 's/.*PermitRootLogin yes|#PermitRootLogin no/PermitRootLogin no/g' /etc/ssh/sshd_config
sed -Ei 's/.*PermitEmptyPasswords yes|#PermitEmptyPasswords no/PermitEmptyPasswords no/g' /etc/ssh/sshd_config
sed -Ei 's/.*PasswordAuthentication yes|#PasswordAuthentication no/PasswordAuthentication no/g' /etc/ssh/sshd_config
sed -Ei 's/.*X11Forwarding yes|#X11Forwarding no/X11Forwarding no/g' /etc/ssh/sshd_config
sed -i '/^#PermitRootLogin/s/yes/no/' /etc/ssh/sshd_config