sed - 这里的区别是什么?

时间:2014-05-06 03:11:46

标签: sed

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

为什么?

1 个答案:

答案 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。当替换发生时,您将获得所需的输出。