Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Sed用大文件替换第一次出现的位置_Unix_Replace_Sed - Fatal编程技术网

Unix Sed用大文件替换第一次出现的位置

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更换后无法使用,因为它将停止打

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

我试过和塞德一起踢球,但我仍在努力获得令人满意的结果

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行和与模式匹配的下一行中进行更改。至少使用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
的变体。

somehour related:.也有些类似。在一台有20 GiB可用空间的机器上,这个文件大约有23 GiB。我只是在500行输入上尝试了这个,但没有任何效果。这很奇怪,因为我期待一个完全不同的故障模式。让我检查一下实践,在附加100行中需要更多的东西。如果可以的话,我添加了$!这永远是真的,所以前100行将被追加不,它只是在适当的位置编辑前100行,其余的保持不变,你不需要那么花哨。只要
'1100 s/input/output/'
如果字符串不止一次出现在所有100行中,那么它将反映在所有100行中,而我的解决方案仅出现在第一个匹配的输入字符串上