Sed不处理所有脚本行

时间:2012-08-15 10:08:33

标签: sed

我的sed script有问题。我使用上面的脚本处理this数据。

问题在于,来自脚本的行:

/^$/d
s/ $/ajes/g

不起作用。当然,如果我再次处理数据,它将会起作用。

这不起作用:

sed -f script.sed -i data.file

但这可行(双重处理):

sed -f script.sed -i data.file
sed -f script.sed -i data.file

为什么?哪里有问题?为什么我不能用所有结果处理它一次?

2 个答案:

答案 0 :(得分:2)

真正的问题是你只有一行。并且sed读取它一次并尝试逐个执行每个命令,而整行在模式空间中。当您将某些内容替换为\n时,它仍然只是一个字符串,它位于模式空间中。它没有分成多个字符串并逐个重读。

显然/^$/\n\n不匹配,而s/ $/ajes/g\n之前的任何空格都不匹配。这就是为什么它不能按照你期望的方式工作的原因。

您可以通过将“非工作”命令修改为

来解决问题
s/\n\+/\n/g # equals to /^$/d
s/ \n/ajes\n/g # equals to s/ $/ajes/g

答案 1 :(得分:1)

那里你有很多替换。让我们说你有替换

  • 规则A
  • 规则B
  • 规则C.

所以,这里的问题是如果规则A 最初不匹配,然后规则B或C匹配导致在替换后再次与A匹配的模式,则规则A不会进入对那条线的影响。因此,您需要分析替换处理的顺序,并希望您能够找到错误。

希望这能帮助你朝着正确的方向前进。