当我在匹配的模式后面添加一些文本时,我想添加一个空行和一个注释,以将我的添加与其他内容隔离开来。但是,我已经注意到,对于第一个\n,我需要使用一个额外的\ (使其为\\n)来转义\,但显然这对于附加文本的其余部分并不是必需的。为何会这样呢?
我在SUSE 11服务器(bash v3.2.57(2)和GNU sed version 4.1.5)上生成的一个示例是:
edwdev@hdpedge1:/edw> sed '/test/a \\nNot a test\nJust Playing' <<< test
test
Not a test
Just Playing如果我没有转义第一个\n (就在a sed命令之后),我将得到一个n,而不是一个换行符。
edwdev@hdpedge1:/edw> sed '/test/a \nNot a test\nJust Playing' <<< test
test
nNot a test
Just Playing注意,我有意在a命令之后添加了一个空格,这样它就不会意外地与替代语法发生冲突。
如果我在\n命令之后用空格的\t.Number替换a,则会发现同样的行为;即使在多个空格之后,也需要转义第一个反斜杠来打印特殊字符。
我最初观察到的另一个环境也是这样: Centos 7 x64 VM,bash版本为4.2.46(2),sed版本为GNU 4.2.2
sed -i '/\[mysqld\]/a \\n# <<INSERTED MANUALLY>>\ntransaction-isolation=READ-COMMITTED\ninnodb_flush_method=O_DIRECT\nmax_connections=550\n# <<END OF MANUAL INSERTIONS >>\n' /etc/my.cnf...
[mysqld]
# <<INSERTED MANUALLY>>
transaction-isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
max_connections=550
# <<END OF MANUAL INSERTIONS >>
...不转义的
[mysqld]
n# <<INSERTED MANUALLY>>
transaction-isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
max_connections=550
# <<END OF MANUAL INSERTIONS >>这种行为有什么特别的原因吗?在浏览文档(这里)时,我无法找到任何细节,当然,我还没有彻底阅读整个文档。
发布于 2019-07-18 13:59:41
这并不是完全记录在案的行为,但整件事都是一个延伸。被扩展的所有三个命令(a、i和c)都是一样的:忽略了前导空格,如果文本以\开头,那么它就会被丢弃。从本质上说,sed使用这些表单中的哪一种并不重要:
i foo
i \foo
i \
foo它们都一样。(我知道我在这里使用了i,但请查看a、i和c的描述--这是超现实的。)
代码展示了同样多的信息:
1111 case 'a':
1112 case 'i':
1113 case 'c':
1114 ch = in_nonblank ();
1115
1116 read_text_to_slash:
1117 if (ch == EOF)
1118 bad_prog (_(EXPECTED_SLASH));
1119
1120 if (ch == '\\')
1121 ch = inchar ();https://unix.stackexchange.com/questions/530871
复制相似问题