在sed中的相同匹配项上执行多个命令

时间:2019-02-05 05:21:17

标签: regex 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 #

4 个答案:

答案 0 :(得分:2)

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

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


编辑: :在此处使用sed添加了1个解决方案。 (我只是在排队  它以line2开始在内存缓冲区\1中,然后简单地将替换项/新值添加到#之前,并在其后附加# invalid

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


请您尝试以下。

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

尝试中正在发生的事情,您只是在进行替换,无论替换行是否从line2开始,每一行都在发生替换,因此当您在替换之前给出该条件时,它将开始起作用。 >

答案 1 :(得分:1)

您可以尝试使用扩展的正则表达式:

sed -r -e '/^line2/ s/(.*)/# \1 #/' file

答案 2 :(得分:1)

您不需要多个命令,只需替换以<ul> {% for product in cart.products.all %} <li>{{ product.title }}</li> {% endfor %} </ul> 开头的行:

line2

答案 3 :(得分:0)

这可能对您有用(GNU sed):

!

此处使用b命令取反了正则表达式,而sed ' /^lines/bjumphere;bjumpthere;:jumphere;s/^/.../;s/$/.../;:jumpthere' file 命令本身分支到所有sed命令的末尾。也许更简单的例子是:

sed '/^line2/{s/^/.../;s/$/.../}' file

当然上面的内容也可以写成:

i

编写一个以换行符结尾的衬线时(例如acrRwW-e命令)以及其他命令,可以为sed脚本的每个部分调用sed -e '/^line2/{i\a couple of lines\ninserted before "line2"' -e '}' file 选项,例如:

sed '/^line2/i\a couple of lines\ninserted before "line2"' file

也可以这样写:

line2

如果没有随后要执行的sed命令,但是也需要删除sed -e '/^line2/b;!i\a couple of lines\ninserted before "line2 then line2 deleted"' -e 'd' file

c

但是,更好的方法是使用sed '/^line2/c\a line changed and a line\nappended for "line2"' file 命令。

{{1}}
相关问题