【问题标题】:Replace two lines in a file with one new line with bash使用 bash 将文件中的两行替换为一个新行
【发布时间】:2012-09-04 09:16:54
【问题描述】:

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

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

【问题讨论】:

  • 你想用新行替换文件夹中所有文件中的文本(任何字符串)的行
  • 我想用一个新行替换文件夹中所有文件中的两行文本(带有一些特殊字符,如制表符、美元符号)
  • 更新了示例文件。第一行可以在文件中出现很多次,但只有在第二行也匹配时才应该替换它。

标签: bash replace


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 首先,行不在固定位置。对于第二个,如果我可以替换行匹配和上一个,而不是以下......
  • 最后一个例子; sed -n '$p; N; /pattern/d; P; D',明明pattern是要匹配的模式,但是哪一部分是替换字符串呢?
  • @Andy J 这里没有替换字符串。这只是删除了这两行。 (哎呀!)要进行替换,您可以这样做:sed -n '$p; N; /pattern/s/.*/repl/; P; D'
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    即使这个问题应该已经回答 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
    

    【讨论】:

    • 第二个选项可以解决问题,但我在文件中留下了一些占位符字符串......这意味着有些行只匹配第一行而不是第二行......将编辑示例...
    • 也许这两个perl regexp 更容易提醒,但我认为@William Pursell 提供的解决方案是您尝试做的最好的解决方案。
    • 我接受您的回答,因为威廉描述的 sed 示例对我来说不是很清楚......在您的回答中,我发现它非常清晰且易于适应我的文件!谢谢!!
    猜你喜欢
    • 2013-09-27
    • 2012-01-10
    • 2021-04-27
    • 2019-07-26
    • 2016-11-20
    • 1970-01-01
    • 2018-03-20
    • 2021-01-28
    相关资源
    最近更新 更多