1

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

问题是,脚本中的行:

/^$/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

这是为什么?问题出在哪里?为什么我不能一次处理所有结果?

4

2 回答 2

2

真正的问题是你只有一条线。并sed读取一次并尝试一一执行每个命令,而整行都在模式空间中。当你用一些东西代替它时,\n它仍然只是一个字符串,它在模式空间中。它没有被分成多个字符串并一一重读。

显然/^$/不匹配你的\n\ns/ $/ajes/g也不匹配你之前的任何空间\n。这就是为什么它不能按您期望的方式工作的原因。

您可以通过修改“非工作”命令来解决问题

s/\n\+/\n/g # equals to /^$/d
s/ \n/ajes\n/g # equals to s/ $/ajes/g
于 2012-08-15T10:36:58.150 回答
1

你在那里有很多替代品。假设你有替换

  • 规则 A
  • 规则 B
  • 规则 C。

因此,这里的问题是,如果规则 A最初不匹配,然后规则 B 或 C 匹配导致替换后将再次与 A 匹配的模式,则规则 A 不会对该行生效。因此,您需要分析处理替换的顺序,并希望您能找到错误。

希望这可以帮助您朝着正确的方向前进。

于 2012-08-15T10:16:31.487 回答