执行和sed命令

时间:2019-02-06 22:35:49

标签: shell sed exec

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

3 个答案:

答案 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 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')

答案 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/' {} +