首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Exec和sed命令

Exec和sed命令
EN

Stack Overflow用户
提问于 2019-02-06 22:35:49
回答 3查看 2K关注 0票数 1

问题是如何将以下命令合并到一行中并使用exec。

代码语言:javascript
复制
find . -name '*.txt' -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;

结果:所有.txt文件的路径和名称。

代码语言:javascript
复制
find . -name '*.txt' -exec sed -n '/stringA/,/stringB/p' {} \;

结果:在所有.txt文件中,开始参数和结束参数之间的行数。

请求的结果:在开始参数和结束参数之间给出行。第一行必须包含.txt文件的路径和名称。

代码语言:javascript
复制
find . -name '*.txt' -exec ???? {} \;

./alpha/file01.txt stringA line1 line2 stringB ./beta/file02.txt stringA line1 line2 stringB

谢谢。在T。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-07 04:09:25

如果文件是非空的,那么您所需要的就是:

代码语言:javascript
复制
find . -name '*.txt' -exec awk 'FNR==1{print FILENAME} /StringA/,/StringB/' {} +

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

代码语言:javascript
复制
find . -name '*.txt' -exec awk 'BEGINFILE{print FILENAME} /StringA/,/StringB/' {} +
票数 0
EN

Stack Overflow用户

发布于 2019-02-06 23:48:37

find的输出输送到其他命令可能比使用-exec更容易。请试用以下方法:

代码语言:javascript
复制
find . -type f -name '*.txt' -print0 | while read -r -d "" f; do echo "$f"; sed -n "/stringA/,/stringB/p" "$f"; done

产生的结果:

代码语言:javascript
复制
./alpha/file01.txt
stringA
line1
line2
stringB
./beta/file02.txt
stringA
line1
line2
stringB
  • -print0选项在find中合并由空字符分隔的文件名。
  • -d ""选项在read中将输入拆分为空字符,以正确地再现文件名列表。
  • 然后,我们可以将$f称为while循环中的文件名。

希望这能有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2019-02-07 01:54:11

使用GNU sedrealpath

代码语言:javascript
复制
sed -sn '1F;/stringA/,/stringB/p' $(realpath *.txt)

或者,如果相对路径是可以接受的:

代码语言:javascript
复制
sed -sn '1F;/stringA/,/stringB/p' ./*.txt

如果代码需要递归到子目录中:

代码语言:javascript
复制
sed -sn '1F;/stringA/,/stringB/p'  $(find . -name '*.txt')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54563616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档