10

我正在尝试在给定模式之前插入文件内容

这是我的代码:

sed -i "" "/pattern/ {
i\\ 
r $scriptPath/adapters/default/permissions.xml"
}" "$manifestFile"

它添加路径而不是文件的内容。

有任何想法吗 ?

4

5 回答 5

20

为了在模式之前插入文本,您需要在读入文件之前将模式空间交换到保持空间。例如:

sed "/pattern/ {
         h
         r $scriptPath/adapters/default/permissions.xml
         g
         N
     }" "$manifestFile"
于 2012-06-28T14:19:38.697 回答
4

只需删除i\\.

例子:

$ cat 1.txt
abc
pattern
def

$ echo hello > 2.txt

$ sed -i '/pattern/r 2.txt' 1.txt

$ cat 1.txt
abc
pattern
hello
def
于 2012-06-28T11:02:02.237 回答
3

我试过托德的回答,效果很好,

但我发现“h”和“g”命令是可以省略的。

多亏了这个常见问题解答(从@vscharf 的评论中找到),托德的答案可以是这一行。

sed -i -e "/pattern/ {r $file" -e 'N}' $manifestFile

编辑: 如果您需要 here-doc 版本,请检查.

于 2019-05-17T08:02:53.837 回答
1

我使用awk得到了类似的东西。看起来很难看,但在我的测试中成功了:

命令:

cat test.txt | awk '
/pattern/ {
    line = $0;
    while ((getline < "insert.txt") > 0) {print};
    print line;
    next
}
{print}'

测试.txt:

$ cat test.txt
some stuff
pattern
some other stuff

插入.txt:

$ cat insert.txt
this is inserted file
this is inserted file

输出:

some stuff
this is inserted file
this is inserted file
pattern
some other stuff
于 2012-06-28T11:27:29.907 回答
0

CodeGnome 的解决方案不起作用,如果模式在最后一行。所以我使用了 3 个命令。

sed -i '/pattern/ i\
        INSERTION_MARKER
        ' $manifestFile
sed -i '/INSERTION_MARKER/r $scriptPath/adapters/default/permissions.xml' $manifestFile
sed -i 's/INSERTION_MARKER//' $manifestFile
于 2015-06-11T05:04:28.270 回答