Bash 按顺序打印正则表达式匹配的每个字符串

Bash 按顺序打印正则表达式匹配的每个字符串,bash,awk,grep,Bash,Awk,Grep,在互联网上搜索了一个小时后,我仍然无法使这个简单的任务正常工作: 过滤以下行 strawberries blueberries tastyapplepies are on the desk apple banana pineapple guava applejuice quite delicious 进入 通过查找每个字段是否包含apple,并使用诸如grep和awkawk'{for(i=1;i等命令,您需要: awk '{for(i=1;i<=NF;i++){if($i~/apple/

在互联网上搜索了一个小时后,我仍然无法使这个简单的任务正常工作:

过滤以下行

strawberries blueberries tastyapplepies are on the desk
apple banana pineapple guava applejuice quite delicious
进入

通过查找每个字段是否包含
apple
,并使用诸如
grep
awk
awk'{for(i=1;i等命令,您需要:

awk '{for(i=1;i<=NF;i++){if($i~/apple/){if(i==NF){printf("%s", $i);} else {printf("%s ",$i);}}}print "";}' <input.txt>
awk '{c=0; for(i=1;i<=NF;i++) if($i~/apple/) printf "%s%s",(++c>1?OFS:""),$i; if (c) print ""}' file

感谢您对“我的问题”做出更严格的回答。此输出将通过右管道传输到另一个程序中,以进行进一步的“装饰”,因此尾随空格无关紧要。除了在包含
apple
的每一行末尾添加一个空行,而不是在最后一个字段中,这将为不包含
apple
的每一行打印一个空行。您的和Vikas有什么区别?Vikas不正确(而且毫无用处)测试
i==NF
,在
printf
参数周围使用不必要的参数,将在
apple
不作为行的最后一个字段出现的行末尾生成一个尾随空白字符,并将为不包含
apple
的每一个输入行打印一个空白行。我的是一种惯用的awk解决方案(另一个是在循环中建立一个字符串,然后打印它).哦,我明白了。我没有提到如果行与任何行不匹配,它应该如何运行,但感谢您使它更好地适应更多情况。当您要求脚本打印匹配的内容时,如果它不匹配,则它不打印任何内容是预期的默认行为,如果您想要其他内容,您只需要说明您的要求那是什么。
perl -anE'$,=" ";@a=grep/apple/,@F and say@a'
awk '{c=0; for(i=1;i<=NF;i++) if($i~/apple/) printf "%s%s",(++c>1?OFS:""),$i; if (c) print ""}' file
$ cat file
strawberries blueberries tastyapplepies are on the desk
apple banana pineapple guava applejuice quite delicious
here is a line without the target word
here is a line ending in apple

$ awk '{c=0; for(i=1;i<=NF;i++) if($i~/apple/) printf "%s%s",(++c>1?OFS:""),$i; if (c) print ""}' file
tastyapplepies
apple pineapple applejuice
apple