用一个带bash的新行替换文件中的两行

时间:2012-09-11 12:30:27

标签: bash replace

我正在尝试用一个新行替换文件中的两行:

foo1.txt
  aaa   aaa
  bbb   bbb
  ccc   ccc
  ddd   ddd
  bbb   bbb
  ddd   ddd

替换后的文件应该如下所示

foo1.txt
  aaa   aaa
  eee   eee
  ddd   ddd
  bbb   bbb
  ddd   ddd

有没有办法使用sed或其他命令在文件夹的所有文件中替换

我一直在尝试使用sed但没有取得任何成功:sed 's/bbb\tbbb\nccc\tccc/eee\teee/g' foo*.txt

3 个答案:

答案 0 :(得分:8)

有很多方法可以解释您的问题。如果您尝试更换固定位置的线,例如第2行和第3行,请执行:

sed '2d; 3s/.*/newtext/'

如果要替换匹配的行和以下行:

sed '/pattern/{ N; s/.*/newtext/; }'

要替换第二行与模式匹配的两个连续行:

sed -n '$p; N; /pattern/d; P; D'

答案 1 :(得分:1)

nawk '{if($0~/bbb.*bbb/){getline;getline;print "newline"};print}' your_file

测试如下:

> cat temp
aaa   aaa
bbb   bbb
ccc   ccc
ddd   ddd
> nawk '{if($0~/bbb.*bbb/){getline;getline;print "newline"};print}' temp
aaa   aaa
newline
ddd   ddd

答案 2 :(得分:1)

即使这个问题已经回答in this thread,我也无法使“一线一命令”的解决方案有效。

此命令:

perl -pe 's/START.*STOP/replace_string/g' file_to_change

似乎对我不起作用,并且不执行多行替换。我不得不将它拆分为两个不同的perl脚本,如下所示:

perl -pe 's/bbb\tbbb\n.*/placeholderstring/g' foo1.txt | perl -pe 's/placeholderstring  ccc\tccc/eee\teee/g'

试着看看什么最适合你。

编辑:

使用新的示例文本,唯一有效的解决方案是William Pursell

sed '/bbb\tbbb/{ N; s/.*ccc\tccc/  eee\teee/; }' foo1.txt