问题是如何将以下命令合并到一行中并使用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 stringA line1 line2 stringB ./beta/file02.txt stringA line1 line2 stringB
谢谢。在T。
发布于 2019-02-07 04:09:25
如果文件是非空的,那么您所需要的就是:
find . -name '*.txt' -exec awk 'FNR==1{print FILENAME} /StringA/,/StringB/' {} +如果它们可以是空的,那么处理它的最简单的方法是为BEGINFILE使用GNU awk:
find . -name '*.txt' -exec awk 'BEGINFILE{print FILENAME} /StringA/,/StringB/' {} +发布于 2019-02-06 23:48:37
将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循环中的文件名。希望这能有所帮助。
发布于 2019-02-07 01:54:11
使用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')https://stackoverflow.com/questions/54563616
复制相似问题