test.txt 文件包含:
AAAAA
BBBBB
CCCCC
或以十六进制:
41 41 41 41 41 0A 42 42 42 42 42 0A 43 43 43 43 43 0A
如果我跑:
sed s / A / B / g test.txt
它返回:
BBBBB
BBBBB
CCCCC
同样地:
sed's / \ x41 / B / g'test.txt
返回:
BBBBB
BBBBB
CCCCC
但如果我跑:
sed's / \ x0A / B / g'test.txt
它仍然会返回:
AAAAA
BBBBB
CCCCC
为什么?
答案 0 :(得分:2)
sed
一次只能在一行上运行。对于文件的每一行,sed
通过从行中删除新行(\n
)将其放在模式空间上并执行一些操作。一旦操作完成,它会将新行放回到行并默认将其打印出来并将下一行读入模式空间(除非强制不使用-n
选项)。这将一直持续到文件结束。
对于您的尝试,当sed
读取第一行时,它已经从行中删除了新行,因此您的替换基本上是无操作。完成后,它会将新行返回到第一行,打印它并将第二行读入模式空间并继续。
要获得所需的输出,您必须将整个文件读入模式空间,每行以新行字符分隔。
您可以这样说:
$ sed ':a;N;s/\x0A/B/;ba' file
AAAAABBBBBBBCCCCC
:a
创建标签N
将下一行追加到由新行分隔的模式空间中,因此您的模式空格不包含line1\nline2
。 s/\x0A/B/
正在从您的模式空间中删除\n
,并将其替换为B
。 ba
告诉sed
返回标签:a
并重复此过程。 sed
再次将下一行附加到模式空间。现在您的模式空间看起来像line1Bline2\nline3
。当替换发生时,您将获得所需的输出。