问题是如何将以下命令合并在一行中并使用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。
答案 0 :(得分:0)
将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
用作文件名。 希望这会有所帮助。
答案 1 :(得分:0)
使用 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')
答案 2 :(得分:0)
如果文件为非空文件,则只需:
find . -name '*.txt' -exec awk 'FNR==1{print FILENAME} /StringA/,/StringB/' {} +
如果它们可以为空,则处理它的最简单方法是对BEGINFILE使用GNU awk:
find . -name '*.txt' -exec awk 'BEGINFILE{print FILENAME} /StringA/,/StringB/' {} +