【问题标题】:sed insert file output between two keywordssed 在两个关键字之间插入文件输出
【发布时间】:2013-05-24 20:12:24
【问题描述】:

我有一个包含以下内容的文件。

file.txt(注意:文件内容不是静态的,是动态的)

H 0 7 11 *

我想使用sed 在两个模式匹配之间插入它们,如下例所示,

文件内容

...
...
<spec>H 0 7 11 *</spec>
...
...

我尝试了以下但我失败了:(它放在那条线以下。

   $ sed '/<spec>/ r file.txt' infile

这是我得到的输出我如何把它放在两个匹配之间?

 <spec></spec>
   H 0 7 11 *

【问题讨论】:

  • &这是文件中唯一的一行?
  • 为什么不能简单地read x &lt; file.txt; echo "&lt;spec&gt;$x&lt;/spec&gt;"
  • @anishsane 是的,仅此而已,但它不是静态内容,它每次都会改变。
  • 那么上面使用简单回显的注释可以吗?如果是,我可以将其添加为答案 ;-)
  • 如果file.txt包含3行数据会怎样? 1行输出还是3或5? &lt;spec&gt; 在一行上,file.txt 的数据在一行或多行上,&lt;/spec&gt; 在另一行上,这有关系吗?如果file.txt 为空怎么办?

标签: regex sed


【解决方案1】:

这个怎么样:

sed 's#\(.*\)#&lt;spec&gt;\1&lt;/spec&gt;#' input_file

更新:

要进行 infile 替换,您可以使用 -i 选项。但是,请小心。您可以在替换之前使用 -i"bak" 来备份文件。

sed -i"bak" 's#\(.*\)#&lt;spec&gt;\1&lt;/spec&gt;#' input_file

更新 2:

awk '/\<spec\>/ { getline a < "dynamic.txt"; sub (/></, ">"a"<", $0); print ;next}1' infile 

更新 3:

您可以混合使用 bash 和 sed。

while read -r value; do  
    sed -i "s/></>$value</" infile ; 
done < dynamic.txt 

【讨论】:

  • 注意:file.txt 内容不是静态的,是动态的
  • 另外加-i这样替换文件内容好不好?
  • 你的语法中的 infile 在哪里?
  • @Satish 同意。这只是为了让球滚动。
  • 看在上帝的份上,当你应该做 cat file.txt| sed 's#...' 时,不要做(哦,显然更有意义)sed 's#...#...#' file.txt。谷歌“无用的猫”了解更多信息。
【解决方案2】:

这将在 sed 执行之前读取文件:

sed -r  "s#(<spec>)(</spec>)#\\1$(<file.txt)\\2#" infile

我假设是 bash。如果您使用另一个 shell,请将 $(&lt;file) 替换为 $(cat file)

如果文件内容包含#,将会有问题。您可以更改 s### 定界符,但风险始终相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 2011-03-28
    • 2014-09-07
    • 2017-05-25
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多