sed命令在多行搜索后插入多行字符串

时间:2014-03-19 22:51:32

标签: linux bash shell sed command

我想在两行特定行之后将文本行插入另一个文本文件中。

在类似

之后插入
some text...
  example text
    (
    );
some text...

我有一个文本文件(包含两行文字),我希望在括号之间插入。

如果我尝试插入的文本文件包含类似于以下内容的文本

need this;
in between the parentheses;

然后我希望结果看起来像这样

some text...
  example text
    (
     need this;
     in between the parentheses;
    );
some text...

什么样的最佳解决方案都可以起作用(不必进行测试)。

编辑澄清

在需要插入文本的部分之前还有其他开括号,例如

sometext...
sometext (sometext)....
sometext
  (
  );
  exampletext
    (
    );
sometext...

所以,我认为" exampletext"需要参考然后查找括号。此外,它可能需要搜索" exampletext"正是因为文档中还有其他行带有" exampletextsometext ..."

完成此操作后,需要将文件添加到原始文件中。

4 个答案:

答案 0 :(得分:5)

如果打开的(单独就行了,你就可以

sed -e '/^(/r fileToInsert' firstFile

因为/^(/找到了要插入的行(“以开括号开头的行”),r表示“读取文件内容并在此处插入。” p>

如果确定插入点所需的表达式必须更复杂,请在注释中详细说明。例如,“完全是一个开括号而不是其他”将是/^($/

编辑感谢您澄清要求。如果您需要在example text后跟(后插入此文本,则以下脚本应该可以正常工作。将其放在自己的文件中,并使其可执行(chmod 755 myScript),然后使用./myScript运行。

#!/bin/bash
sed '
/exampletext/ {
  N
  /(/ r multi2.txt
}' multi1.txt

说明:

/exampletext/ {     find a match of this text, then…
N                   go to the next line
/(/                 match open parenthesis
r multi2.txt        insert file 'multi2.txt' here
}'                  end of script
multi1.txt          name of input file

请注意,这会产生stdout的输出。您可以将其指向新文件名 - 例如

./myScript > newFile.txt

我使用以下输入文件(multi1.txt)测试了这个:

some text...
sometext...
sometext (sometext)....
  exampletext
  not the right string
    (
    );
sometext
  (
  );
  exampletext
    (
    );
sometext...

它给出了输出

some text...
sometext...
sometext (sometext)....
  exampletext
  not the right string
    (
    );
sometext
  (
  );
  exampletext
    (
insert this
and that
    );
sometext...

我认为你想要的是什么?文本被插入example text后跟一个左括号的位置 - 但是当它们之间还有另一条直线时...

答案 1 :(得分:2)

以下是使用awk

执行此操作的另一种方法
awk '/^\(/{print $0; while((getline line <"filetoInsert") > 0) print line; next}1' firstFile

<强>解释

  • 我们使用一个简单的正则表达式/^\(/来表示查看以左括号开头的行。
  • 一旦遇到该行,我们就会打印出来。
  • 然后我们使用getline函数来读取第二个文件。
  • 完成阅读和打印后,我们使用next来避免默认打印原始文件行(我们的paren),因为我们使用您看到的1启用了默认打印在末尾。

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -e '$!N;/^(\n);$/{r insert_file' -e '};P;D' first_file

答案 3 :(得分:0)

也在python中:

import sys

with open(sys.argv[2]) as secondFile:
    insertStrList=secondFile.readlines()

firstStrList=[]
with open(sys.argv[1]) as firstFile:
    while True:
        i_str=firstFile.readline()
        if not i_str: 
            break
        firstStrList.append(i_str)
        if i_str == '(\n':
            firstStrList+=insertStrList

print ''.join(firstStrList)

将其与python mergeParenthesis.py a.txt b.txt

一起使用

但我同意Floris的答案更容易;)

欢呼声