Sed用大文件替换第一次出现

时间:2015-06-16 15:25:52

标签: unix replace sed

我有大约50个大文本文件(~4GB),我只需要替换位于这些文件的前100行中的一个字符串。实际上我需要的是一个unix命令行,它寻找第一个匹配,替换它并放置。

我尝试过用sed玩,但我仍然在努力获得令人满意的结果。

3 个答案:

答案 0 :(得分:4)

您可以使用sed编辑第一场比赛:

sed -e '1,/pattern/{s/pattern/replace/;}'

在第1行到第N-1行(其中第N行包含模式),替换什么都不做;在N行,它做了真正的工作。此后,您不再处于1,/pattern/行范围内,因此无法进一步转换。

请注意,如果第1行与模式匹配,则不起作用;然后它在第1行和与模式匹配的下一行进行更改。至少使用GNU sed,您可以将1更改为0,这样就行了。

printf "%s\n" pattern pattern pattern pattern |
sed -e '0,/pattern/{s/pattern/replace/;}'

然而,描述说“在前100行”,而第1行在前100行中,这不是你在第1行出现时通常描述的方式。

您可以添加-i选项,以便在测试后覆盖原始文件。请注意:并非所有版本的sed都支持-i,而在Mac OS X上,备份后缀必须为-i.bak(但可以为空:使用-i '')。相比之下,GNU sed有一个可选后缀,必须附加到-i选项。因此,-i.bak适用于GNU和Mac(BSD)sed; -i选项的其他用途特定于您正在使用的sed变体。

答案 1 :(得分:2)

sed -i '1,100 { :a; N; $! ba; s/input/output/ }' file
  • :a; N; $! ba在模式空间中追加前100行
  • 所有100行将被视为一个字符串。
  • 然后替换将仅关注第一个匹配的模式。
  • -i正在进行编辑
替换后无法使用

q,因为它会停止打印剩余的行。

在执行上述sed之前,我建议检查文件中的模式字符串以及

的位置
sed -n '/patternstring/{=;p}' file

其中=是打印行号(一些grep样式的sed命令)

或者如果您想在找到第一场比赛后立即退出

sed -n '/patternstring/{=;p;q}' file

答案 2 :(得分:2)

如果您想要在不知道确切位置的情况下处理第一次出现,可以使用ed。这是一个非常古老的行编辑器,写在记忆稀缺的时代。它可能比这里的sed效率稍低,但是对于不完全符合预期的模式而言,它更简单,更强大。

echo '/input/s/input/output/
wq' | ed file