[英]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
而不是\n
: s/\(.*\)##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.