繁体   English   中英

SED 的替换字符串被认为是单行字符串,而它包含换行符

[英]SED's Substituted string is considered as one-line string, whereas it contains newline character

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

假设我有以下文字:

// ##OPTION_NAME: xxxx

我想用##OP-NAME替换标记##OPTION_NAME并用 2 个新行包围它; 像这样:

// ##OP-START
// ##OP-NAME: xxxx
// ##OP-END

To illustrate this, I put this text in a code.c file, and the sed commands in a sed script named script.sed .
然后,我调用以下 shell 命令:

Shell 命令

sed -f script.sed code.c

脚本.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

我在替换命令s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g中尝试了\r\n而不是\ns/\(.*\)##OPTION_NAME:\(.*\)/\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//

关于模式保持空间: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html#tag_20_116_13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM