Bash SED';被替换的字符串被视为一行字符串,而它包含换行符

Bash SED';被替换的字符串被视为一行字符串,而它包含换行符,bash,shell,sed,Bash,Shell,Sed,我正在测试sed命令,用3行替换一行,然后删除最后一行。(我本可以用前两行来代替它,但这是故意这样说的,以展示主要问题) 假设我有以下文本: // ##OPTION_NAME: xxxx 我想用##OP-NAME替换令牌##OPTION_NAME,并用两行新行围绕它;像这样: // ##OP-START // ##OP-NAME: xxxx // ##OP-END 为了说明这一点,我将此文本放在code.c文件中,并将sed命令放在名为script.sed的sed脚本中 然后,我调用以下sh

我正在测试sed命令,用3行替换一行,然后删除最后一行。(我本可以用前两行来代替它,但这是故意这样说的,以展示主要问题)

假设我有以下文本:

// ##OPTION_NAME: xxxx
我想用
##OP-NAME
替换令牌
##OPTION_NAME
,并用两行新行围绕它;像这样:

// ##OP-START
// ##OP-NAME: xxxx
// ##OP-END
为了说明这一点,我将此文本放在code.c文件中,并将sed命令放在名为script.sed的sed脚本中
然后,我调用以下shell命令:

Shell命令

# Begin by replacing patterns by their equivalents, surrounding them with ##OP-START and ##OP-END lines
s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g
sed-f script.sed code.c
script.sed

# Begin by replacing patterns by their equivalents, surrounding them with ##OP-START and ##OP-END lines
s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g
问题 现在,我在script.sed中添加了另一个sed命令,以删除包含
##OP-END
的行。惊喜所有3行都已删除

# Begin by replacing patterns by their equivalents, surrounding them with ##OP-START and ##OP-END lines
s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g

# Last parse; delete ##OP-END
/##OP-END/d
我尝试了替换命令中的
\r\n
而不是
\n
s/\(.*)选项名称:\(.*)/\1#OP-START\n\1#OP-NAME:\2\n\1#OP-END/g
,但它不起作用

我还测试了
##OP-START
,看看它是否有所不同, 但是,唉!所有3条线也被移除


似乎sed将其视为一条线

这并不奇怪,
d
在模式空间上运行,而不是在每行的基础上运行。使用
s
命令修改后,图案空间包含3行。它的内容与表达式匹配,因此被删除

要从图案空间中删除此行,需要再次使用
s
命令:

s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g$
s/\n\/\/ ##OP-END//

关于图案和保持空间:

这并不奇怪,
d
在图案空间上运行,而不是在每行的基础上运行。使用
s
命令修改后,图案空间包含3行。它的内容与表达式匹配,因此被删除

要从图案空间中删除此行,需要再次使用
s
命令:

s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g$
s/\n\/\/ ##OP-END//

关于图案和保持空间:

有趣!我做了一些测试,我想我明白你的意思了。但是为什么您用
\/\/
预先编写了
@@OP-END
(对我不起作用)。相反,我使用了
s/\n.*#OP-END/
,效果很好。
\n.*
。也许你用了tab而不是空格,多个空格等等,所以我的正则表达式并不有趣!我做了一些测试,我想我明白你的意思了。但是为什么您用
\/\/
预先编写了
@@OP-END
(对我不起作用)。相反,我使用了
s/\n.*#OP-END/
,效果很好。
\n.*
。可能您使用了tab而不是空格、多个空格等,因此我的正则表达式不匹配