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

Regex 在sed中的同一匹配项上执行多个命令,regex,sed,Regex,Sed,我知道我可以在sed中对匹配项运行命令,如下所示: $ cat file line1 line2 line3 line4 $ sed -e "/^line2/ s/^/# /" file line1 # line2 line3 line4 是否可以在同一个匹配上运行多个命令,例如s/^/#/和s/$/#无效/ 我尝试将两者都添加,但出现错误: $ sed -e "/^line2/ s/^/# / s/$/ # /" file sed: -e expression #1, char 18: u

我知道我可以在
sed
中对匹配项运行命令,如下所示:

$ cat file
line1
line2
line3
line4

$ sed -e "/^line2/ s/^/# /" file
line1
# line2
line3
line4
是否可以在同一个匹配上运行多个命令,例如
s/^/#/
s/$/#无效/

我尝试将两者都添加,但出现错误:

$ 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 #
EDIT2:如果您特别希望在满足条件时执行多个语句,那么您可以使用
{..}
块语句,如下所示(刚才看到@Tiw在注释中也提出了同样的建议)



编辑:在此处使用
sed
再添加一个解决方案。(我只是在排队 它从内存缓冲区中的
行2
开始
\1
,然后简单地将替换的/new\u值添加到
之前,并在其后面附加
\invalid



你能试试下面的吗

sed "/^line2/ s/^/# /;/^line2/s/$/ # invalid/"  Input_file
在您的尝试中发生的事情,您只是在每一行上进行替换,而不管它是否从
line2
开始,因此,当您在替换之前给出该条件时,它应该会起作用。

EDIT2:如果您特别希望在一个条件满足时执行多个语句,那么您可以使用
{..}
块语句,如下所示(刚才看到@Tiw在注释中也建议了同样的事情)



编辑:在此处使用
sed
再添加一个解决方案。(我只是在排队 它从内存缓冲区中的
行2
开始
\1
,然后简单地将替换的/new\u值添加到
之前,并在其后面附加
\invalid



你能试试下面的吗

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

在您的尝试中发生了什么,您只是在每一行上进行替换,而不管它是否从
line2
开始,因此当您在替换之前给出该条件时,它应该会起作用。

您可以尝试使用扩展regexp:

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

您可以尝试使用扩展regexp:

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

您不需要多个命令,只需替换以
line2
开头的行即可:

sed "s/^line2.*/# & #/" file

您不需要多个命令,只需替换以
line2
开头的行即可:

sed "s/^line2.*/# & #/" file
这可能适用于您(GNU-sed):

这里使用
来否定regexp
命令和
b
命令本身分支到所有sed命令的末尾。也许更简单的例子是:

sed ' /^lines/bjumphere;bjumpthere;:jumphere;s/^/.../;s/$/.../;:jumpthere' file
当然,上述内容也可以写成:

sed '/^line2/{s/^/.../;s/$/.../}' file
sed '/^line2/i\a couple of lines\ninserted before "line2"' file
当编写以换行符结尾的一行程序(如
i
a
c
r
r
w
w
命令)以及需要更多命令时,可以为sed脚本的每个部分调用
-e
选项,例如:

sed -e '/^line2/{i\a couple of lines\ninserted before "line2"' -e '}' file
也可以写:

sed '/^line2/{s/^/.../;s/$/.../}' file
sed '/^line2/i\a couple of lines\ninserted before "line2"' file
如果没有要执行的后续sed命令,但是如果也需要删除
line2

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
这可能适用于您(GNU-sed):

这里使用
来否定regexp
命令和
b
命令本身分支到所有sed命令的末尾。也许更简单的例子是:

sed ' /^lines/bjumphere;bjumpthere;:jumphere;s/^/.../;s/$/.../;:jumpthere' file
当然,上述内容也可以写成:

sed '/^line2/{s/^/.../;s/$/.../}' file
sed '/^line2/i\a couple of lines\ninserted before "line2"' file
当编写以换行符结尾的一行程序(如
i
a
c
r
r
w
w
命令)以及需要更多命令时,可以为sed脚本的每个部分调用
-e
选项,例如:

sed -e '/^line2/{i\a couple of lines\ninserted before "line2"' -e '}' file
也可以写:

sed '/^line2/{s/^/.../;s/$/.../}' file
sed '/^line2/i\a couple of lines\ninserted before "line2"' file
如果没有要执行的后续sed命令,但是如果也需要删除
line2

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

是的,这是有效的,但我正在寻找一种在同一匹配块中执行此操作的方法。@IMTheNachoMan,请立即尝试我的编辑解决方案,并让我知道?谢谢。我把
{}
放错地方了。这管用!是的,这是有效的,但我正在寻找一种在同一匹配块中执行此操作的方法。@IMTheNachoMan,请立即尝试我的编辑解决方案,并让我知道?谢谢。我把
{}
放错地方了。这管用!可能重复@Tiw我很抱歉,我应该提出一个问题,我尝试了
{}
块,但无法使其工作。然而,我现在意识到我做错了什么,并使用它:
sed-e/^line2/{s/^/#s/$/#asdf/}”文件
@tripleee这是一个重复,因为他们都想组合命令,但我的唯一之处在于我想匹配一个模式,然后应用像
s///
a TEXT
这样的命令。可能重复@Tiw我很抱歉,我应该提出一个问题,我尝试了
{/code>块,但无法使其工作。然而,我现在意识到我做错了什么,并使用它:
sed-e/^line2/{s/^/#s/$/#asdf/}”文件
@tripleee这是一个重复,因为它们都想要组合命令,但我的独特之处在于我想要匹配一个模式,然后应用像
s///
文本这样的命令。
#
只是一个例子。理想情况下,我希望运行多个命令,如
a TEXT
I TEXT
s//
d
等。
只是一个例子。理想情况下,我想运行多个命令,如
a TEXT
I TEXT
s///
d
,等等。我想做的不仅仅是
s///
。我想做的不仅仅是
s//