bash - 仅在第一次匹配后在另一个文件中添加文件内容
问题描述
使用 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 命令以而不是字母开头,似乎我不能使用地址。
只要我只能将临时文件内容插入另一个文件一次,我就不会拘泥于地址。
解决方案
你得到这个错误是因为如果你有一个地址范围(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
推荐阅读
- gulp - 如何使用 Browserify 和 coffeeify 转换将 CoffeeScript 转换为 JavaScript(最后 2 个版本,即 >= 11)?
- maven - 子项目找不到具有 relativePath 的父项
- windows - 如果选项以 hypen 开头,则批处理文件命令行参数解析错误
- java - 使用套接字和 XMPP 发送消息
- reactjs - 如何创建 React Native Navigation 路线?
- ruby-on-rails - 在 Ruby on rails 中使用 CarrierWave 文件上传时 Imagemagick 的安装链接
- angularjs - 如何将颜色设置为 Angular-nvd3 (1.0.7)
- python - 如何在 python rdflib 中附加 .ttl 文件
- c - x++ 的增量操作何时发生?
- recursion - 计算矩阵的迹;语法错误