问题是,脚本中的行:
/^$/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
这是为什么?问题出在哪里?为什么我不能一次处理所有结果?
真正的问题是你只有一条线。并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
你在那里有很多替代品。假设你有替换
因此,这里的问题是,如果规则 A最初不匹配,然后规则 B 或 C 匹配导致替换后将再次与 A 匹配的模式,则规则 A 不会对该行生效。因此,您需要分析处理替换的顺序,并希望您能找到错误。
希望这可以帮助您朝着正确的方向前进。