exec和sed命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了exec和sed命令相关的知识,希望对你有一定的参考价值。

问题是如何在一行中组合以下命令并使用exec。

find . -name '*.txt' -exec sh -c 'echo "$(sed -n "$p" "$1"),$1"' _ {} ;

结果:所有.txt文件的路径和名称。

find . -name '*.txt' -exec sed -n '/stringA/,/stringB/p' {} ;

结果:所有.txt文件的开始和结束参数之间的行。

请求的结果:给出开始和结束参数之间的线。第一行必须包含.txt文件的路径和名称。

find . -name '*.txt' -exec ???? {} ;

./alpha/file01.txt

一号线

2号线

stringB

./beta/file02.txt

一号线

2号线

stringB

谢谢。 T.

答案

如果文件非空,那么您只需要:

find . -name '*.txt' -exec awk 'FNR==1{print FILENAME} /StringA/,/StringB/' {} +

如果它们可以为空,那么处理它的最简单方法是使用GNU awk作为BEGINFILE:

find . -name '*.txt' -exec awk 'BEGINFILE{print FILENAME} /StringA/,/StringB/' {} +
另一答案

find的输出传递给其他命令比使用-exec更容易。请尝试以下方法:

find . -type f -name '*.txt' -print0 | while read -r -d "" f; do echo "$f"; sed -n "/stringA/,/stringB/p" "$f"; done

产量:

./alpha/file01.txt
stringA
line1
line2
stringB
./beta/file02.txt
stringA
line1
line2
stringB
  • -print0中的find选项合并由空字符分隔的文件名。
  • -d ""中的read选项将输入拆分为空字符,以正确再现文件名列表。
  • 然后我们可以将$f称为while循环中的文件名。

希望这可以帮助。

另一答案

使用GNU sedrealpath

sed -sn '1F;/stringA/,/stringB/p' $(realpath *.txt)

或者,如果相对路径是可接受的:

sed -sn '1F;/stringA/,/stringB/p' ./*.txt

如果代码需要递归到子目录中:

sed -sn '1F;/stringA/,/stringB/p'  $(find . -name '*.txt')

以上是关于exec和sed命令的主要内容,如果未能解决你的问题,请参考以下文章

shell中exec解析

shell中exec解析(转)

Linux 下shell中exec解析

linux中fork,source和exec的区别

linux中fork, source和exec的区别

linux中fork,source和exec的区别