Unix Sed用大文件替换第一次出现的位置
我有大约50个大文本文件(~4GB),我只需要替换这些文件前100行中的一个字符串。事实上,我需要的是一个unix命令行,用于查找第一个匹配项,将其替换到位并断开 我试过和塞德一起踢球,但我仍在努力获得令人满意的结果Unix Sed用大文件替换第一次出现的位置,unix,replace,sed,Unix,Replace,Sed,我有大约50个大文本文件(~4GB),我只需要替换这些文件前100行中的一个字符串。事实上,我需要的是一个unix命令行,用于查找第一个匹配项,将其替换到位并断开 我试过和塞德一起踢球,但我仍在努力获得令人满意的结果 sed -i '1,100 { :a; N; $! ba; s/input/output/ }' file :a;N、 美元!ba正在模式空间中追加前100行 所有100行将被视为一个字符串 然后替换将只考虑第一个匹配的模式 -i正在就地编辑 q更换后无法使用,因为它将停止打
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
如果您想在不知道确切位置的情况下处理第一次发生的情况,可以使用
ed
。这是一个非常古老的行编辑器,写在内存不足的时候。在这里,它可能比sed的效率稍低,但更简单、更健壮,以防模式不符合预期
echo '/input/s/input/output/
wq' | ed file
您最多可以使用
sed
编辑第一个匹配项:
sed -e '1,/pattern/{s/pattern/replace/;}'
在第1行到第N-1行(其中第N行包含图案)上,替换不起任何作用;在N线上,它完成了真正的工作。此后,您不再在1、/pattern/
行范围内,因此没有进一步的转换
请注意,如果第1行与模式匹配,则这不起作用;然后,它在第1行和与模式匹配的下一行中进行更改。至少使用GNUsed
,您可以将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'
)。相比之下,GNUsed
有一个可选后缀,必须附加到-i
选项。因此,-i.bak
可以与GNU和Mac(BSD)sed
一起工作;-i
选项的其他用法特定于您正在使用的sed
的变体。somehour related:.也有些类似。在一台有20 GiB可用空间的机器上,这个文件大约有23 GiB。我只是在500行输入上尝试了这个,但没有任何效果。这很奇怪,因为我期待一个完全不同的故障模式。让我检查一下实践,在附加100行中需要更多的东西。如果可以的话,我添加了$!这永远是真的,所以前100行将被追加不,它只是在适当的位置编辑前100行,其余的保持不变,你不需要那么花哨。只要'1100 s/input/output/'
如果字符串不止一次出现在所有100行中,那么它将反映在所有100行中,而我的解决方案仅出现在第一个匹配的输入字符串上