unix - Sed 用大文件替换第一次出现的地方

标签 unix replace sed

我有大约 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/

相关文章:

xml - 使用sed修改xml文件

linux文本电影,减去一列的数字使用其他列或添加一个特定数字?

c - fork() 之后创建的子进程的父 pid_t

bash - cd 命令在 bash 中看不到该目录

java - 莫尔斯电码到英语/英语到莫尔斯电码转换器

PHP 数组值替换(或替代)

linux - 使用 linux sed 命令更新文件

linux - sed 两个模式搜索并在第二个模式的最后一次出现后追加行

linux - 在 ping 中使用 -m 选项

javascript - 优化路径替换的正则表达式