首页 > 解决方案 > 在 sed 中对同一匹配执行多个命令

问题描述

sed我知道我可以像这样针对匹配运行命令:

$ cat file
line1
line2
line3
line4

$ sed -e "/^line2/ s/^/# /" file
line1
# line2
line3
line4

是否可以在同一场比赛s/^/#/中运行多个命令?s/$/ # invalid/

我尝试将它们都添加,但出现错误:

$ sed -e "/^line2/ s/^/# / s/$/ # /" file
sed: -e expression #1, char 18: unknown option to `s'

我尝试使用;,但这似乎丢弃了初始匹配并在输入的每一行上执行:

$ sed -e "/^line2/ s/^/# / ; s/$/ # /" file
line1 #
# line2 #
line3 #
line4 #

标签: regexsed

解决方案


EDIT2:如果您非常希望在满足条件时执行多个语句,那么您可以使用{..}如下块语句。(刚刚看到@Tiw 在评论中也提出了同样的建议。)

sed '/^line2/ {s/^/#/; s/$/ # invalid/}'  Input_file


编辑:在这里添加另外 1 个解决方案sed。(我只是line2在内存缓冲区中\1然后将替换/新值添加#在它之前并# invalid在它之后添加)

sed '/^line2/s/\(.*\)/# \1 # invalid/'  Input_file


请您尝试以下操作。

sed "/^line2/ s/^/# /;/^line2/s/$/ # invalid/"  Input_file

在您的尝试中发生了什么,您只是在进行替换,这发生在每一行上,无论它是否从开始line2,所以当您在替换之前给出该条件时,它应该可以工作。


推荐阅读