我有大约 50 个大文本文件 (~4GB),我只需要替换这些文件前 100 行中的一个字符串。事实上,我需要的是一个 unix 命令行,用于查找第一个匹配项,将其替换到位并中断。
我尝试过使用 sed,但我仍在努力获得令人满意的结果。
最佳答案
您可以使用 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
变体。
关于unix - Sed 用大文件替换第一次出现的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30871868/