【问题标题】:How to echo multiple lines into files coming from a grep result如何将多行回显到来自 grep 结果的文件中
【发布时间】:2015-09-18 09:18:34
【问题描述】:

我想将多行回显到来自 grep 结果的文件中。

实际上,我是grep 来自某些文件的一些文本,带有命令:

find . -name *.h -o -name *.c -o -name *.cpp | xargs grep -n -l --color Apache

上述命令的输出如下:

./DIR/A.h
./DIR/B.cpp
./DIR/C.c

借助 grep 命令的-l 选项,我可以从 grep 结果中获取文件名。

现在我想在文件A.h B.cpp C.c 中插入多行。

我该怎么做?

【问题讨论】:

  • 简单说明一下:您必须在 find: find . -name '*.h' -o -name '*.c' -o -name '*.cpp' 的参数中引用您的 glob。
  • 再次使用 xargs 然后使用 sed 的东西。

标签: linux bash grep


【解决方案1】:

试试这个:

find . -name *.h -o -name *.c -o -name *.cpp | \
xargs grep -n -l --color Apache | \
xargs sed -i '1s/^/text to prepend\n/'

这将在每个文件上添加文本“text to prepend”。

【讨论】:

  • 谢谢,但@Slava Semushin 给出了第一个答案
【解决方案2】:

这取决于文件中要插入行的位置。在最简单的情况下,您可以将它们附加到末尾:

find . -name '*.h' -o -name '*.c' -o -name '*.cpp' |
xargs grep -n -l |
while read FILE; do echo -e "line1\nline2" >>"$FILE"; done

这里我们使用while 循环将每个文件名读取到FILE 变量并将echo 输出附加到每个文件的末尾。

更新:用于插入文件的开头:

find . -name '*.h' -o -name '*.c' -o -name '*.cpp' |
xargs grep -n -l |
while read FILE; do (echo -e "line1\nline2"; cat "$FILE") >>"$FILE.new" && mv "$FILE.new" "$FILE"; done

对于更高级的情况,您可以使用具有特殊命令的sedai)。

【讨论】:

  • 我想在文件开头插入行
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2017-04-07
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
相关资源
最近更新 更多