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

Psy*_*ust 2 unix replace sed

我有大约 50 个大文本文件(~4GB),我只需要替换位于这些文件前 100 行中的一个字符串。事实上,我需要的是一个 unix 命令行,用于查找第一个匹配项,将其替换到位并中断。

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

Jon*_*ler 7

您可以使用sed以下命令最多编辑第一个匹配项:

sed -e '1,/pattern/{s/pattern/replace/;}'
Run Code Online (Sandbox Code Playgroud)

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

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

printf "%s\n" pattern pattern pattern pattern |
sed -e '0,/pattern/{s/pattern/replace/;}'
Run Code Online (Sandbox Code Playgroud)

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

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