exec和sed命令

问题描述 投票:1回答:3

问题是如何在一行中组合以下命令并使用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.

shell sed exec
3个回答
0
投票

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

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

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

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

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循环中的文件名。

希望这可以帮助。


0
投票

使用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')
© www.soinside.com 2019 - 2024. All rights reserved.