使用sed在多个文件中的给定行插入文件内容

3
我想在当前文件夹及其子文件夹中查找所有符合模式(cs*.dat3)的文件,并将一个文本块插入到给定行,可以从文件或bash变量中获取。也可以在文件中匹配模式后插入文本块,而不是在给定行之后。
PRESSURE_RELIEF_PANELS
EXIT PRESSURE_RELIEF_PANELS

所以这些内容会被重复放置两次。幸运的是,第一个PRESSURE_RELIEF_PANELS总是在第32行,因此可以利用它。我目前的做法是:

find . -name cs*.dat3 -exec sed '33iblah' {} \;

输出

PRESSURE_RELIEF_PANELS
blah
EXIT PRESSURE_RELIEF_PANELS

现在,我不想插入“blah”,而是想插入一块文本。这个文本存储在一个文件中,它可以被暂时地存储在bash变量中,或者以某种路径或文件的形式读入sed中。因为我无法将sed的插入语句(i)与文件名语句(r)结合起来,所以我一直没有找到一个好的解决方案。有人能帮忙吗?
2个回答

3
您可以使用读取文件命令并提供文件地址。例如:
sed '33rfile' input

将名为file的文件插入到input的第33行之后。

您可能已经知道r是GNU扩展。

引用手册中的话:

`r FILENAME'

 As a GNU extension, this command accepts two addresses.

 Queue the contents of FILENAME to be read and inserted into the
 output stream at the end of the current cycle, or when the next
 input line is read.  Note that if FILENAME cannot be read, it is
 treated as if it were an empty file, without any error indication.

 As a GNU `sed' extension, the special value `/dev/stdin' is
 supported for the file name, which reads the contents of the
 standard input.

1
谢谢,这个很好用。记录一下,我的最终工作命令是 find . -name cs*.dat3 -exec sed -i '33r../text.dat' {} \; - Krøllebølle

2

您可以做以下事情:

find . -name cs*.dat3 -exec sed -i.bak '/^PRESSURE_RELIEF_PANELS$/r file.dat' '{}' \;

文件file.dat将包含要插入的数据。


这给了我以下错误:sed:-e表达式#1,char 1:未知命令:'^'^是什么?第一个匹配还是其他什么? - Krøllebølle
实际上,我在复制/粘贴时错过了^前面的/ - anubhava
是的,这很有道理 - 这也可以工作。^ 是否意味着只匹配第一次出现? - Krøllebølle
1
在正则表达式中,^ 是行起始锚点,$ 是行结束锚点。这是为了确保 PRESSURE_RELIEF_PANELS 是一行中唯一的字符串,并且我们要在该行之后插入文件内容。 - anubhava
好的,谢谢。我应该真的找时间深入研究正则表达式。 - Krøllebølle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接