首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sed中第一个附加的Newline中需要额外的反斜杠

在sed中第一个附加的Newline中需要额外的反斜杠
EN

Unix & Linux用户
提问于 2019-07-18 13:11:12
回答 1查看 130关注 0票数 2

当我在匹配的模式后面添加一些文本时,我想添加一个空行和一个注释,以将我的添加与其他内容隔离开来。但是,我已经注意到,对于第一个\n,我需要使用一个额外的\ (使其为\\n)来转义\,但显然这对于附加文本的其余部分并不是必需的。为何会这样呢?

我在SUSE 11服务器(bash v3.2.57(2)和GNU sed version 4.1.5)上生成的一个示例是:

代码语言:javascript
复制
edwdev@hdpedge1:/edw> sed '/test/a \\nNot a test\nJust Playing' <<< test
test

Not a test
Just Playing

如果我没有转义第一个\n (就在a sed命令之后),我将得到一个n,而不是一个换行符。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
...
[mysqld]

# <<INSERTED MANUALLY>>
transaction-isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
max_connections=550
# <<END OF MANUAL INSERTIONS >>

...

不转义的

输出\n:

代码语言:javascript
复制
[mysqld]
n# <<INSERTED MANUALLY>>
transaction-isolation=READ-COMMITTED
innodb_flush_method=O_DIRECT
max_connections=550
# <<END OF MANUAL INSERTIONS >>

这种行为有什么特别的原因吗?在浏览文档(这里)时,我无法找到任何细节,当然,我还没有彻底阅读整个文档。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-07-18 13:59:41

这并不是完全记录在案的行为,但整件事都是一个延伸。被扩展的所有三个命令(aic)都是一样的:忽略了前导空格,如果文本以\开头,那么它就会被丢弃。从本质上说,sed使用这些表单中的哪一种并不重要:

代码语言:javascript
复制
i foo
i \foo
i \
foo

它们都一样。(我知道我在这里使用了i,但请查看aic的描述--这是超现实的。)

代码展示了同样多的信息:

代码语言:javascript
复制
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 ();
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/530871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档