首页 > 解决方案 > 仅在第一次匹配后在另一个文件中添加文件内容

问题描述

使用 bash,我有这行代码在特定匹配后将临时文件的内容添加到另一个文件中:

sed -i "/text_to_match/r ${tmpFile}" ${fileName}

我希望它仅在第一次匹配后添加临时文件内容。

我尝试使用地址:

sed -i "0,/text_to_match//text_to_match/r ${tmpFile}" ${fileName}

但它不起作用,说“/”是一个未知命令。

如果我使用标准替换“s/to_replace/with_this/”,我可以使地址工作,但我不能使用这个 sed 命令使其工作。/如果我的 sed 命令以而不是字母开头,似乎我不能使用地址。

只要我只能将临时文件内容插入另一个文件一次,我就不会拘泥于地址。

标签: bashsed

解决方案


你得到这个错误是因为如果你有一个地址范围(ADDR1,ADDR2)你不能在它之后放置另一个地址:sed 需要一个命令,而/不是一个命令。

你会想在这里使用一些大括号:

$ seq 20 > file
$ echo "new content" > tmpFile
$ sed '0,/5/{/5/ r tmpFile
}' file

仅在带有 '5' 的第一行之后输出新文本

1
2
3
4
5
new content
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

我发现我需要在文件名后面加一个换行符。否则我会收到此错误

sed: -e expression #1, char 0: unmatched `{'

似乎 sed 将该行的其余部分作为文件名。

可能写得更整洁

sed '0,/5/ {
    /5/ r tmpFile 
}' file

完全透明:除了非常简单的任务,我不使用 sed。实际上,我会使用 awk 来完成这项工作

awk '
    {print} 
    !seen && $0 ~ patt {
        while (getline line < f) print line
        close(f)
        seen = 1
    }
'  patt="5" f=tmpFile file

推荐阅读