我有大约50个大文本文件(~4GB),我只需要替换位于这些文件的前100行中的一个字符串。实际上我需要的是一个unix命令行,它寻找第一个匹配,替换它并放置。
我尝试过用sed玩,但我仍然在努力获得令人满意的结果。
答案 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行-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