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 sed
和realpath
:
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命令的主要内容,如果未能解决你的问题,请参考以下文章