我知道我可以像这样对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 #
答案 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
编写一个以换行符结尾的衬线时(例如a
,c
,r
,R
,w
,W
和-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}}