如何在bash中查找和打印所有AWK匹配项

  • 本文关键字:AWK 打印 bash 查找 awk echo
  • 更新时间 :
  • 英文 :


我在变量中存储了很多文本。

text="This is sentence! this is not sentence! This is sentence. this is not sencence."

我正在通过以下命令查找句子:

echo $text | awk 'match($0,/([A-Z])([^!?.]*)([!?.])/) { print substr($0,RSTART,RLENGTH) }'

我的结果是:

This is sentence!

预期输出:

This is sentence!
This is sentence.

更多示例:文中有语法正确和不正确的句子。正确的句子由开头和结尾的大写字母(.?!(标识。我只想打印正确的句子。

text="incorrect sentence! this is not sentence! This is sentence. this is not sencence. This is correct sentence."

预期输出:

This is sentence.
This is correct sentence.

我能找到第一场比赛,但不是全部。谢谢你的帮助:(

您可以将GNU awk用于多字符RS:

$ echo "$text" | awk -v RS='[A-Z][^!?.]*[!?.]' 'RT{print RT}'
This is sentence!
This is sentence.

或用于FPAT:的GNU awk

$ echo "$text" | awk -v FPAT='[A-Z][^!?.]*[!?.]' '{for (i=1; i<=NF; i++) print $i}'
This is sentence!
This is sentence.

或用于-o:的GNU grep

$ echo "$text" | grep -o '[A-Z][^!?.]*[!?.]'
This is sentence!
This is sentence.

如果一个句子可以包含换行符,则只有上述第一项才有效。

您需要一个带有match():的while()

$ echo $text | awk '
{
while(match($0,/([A-Z])([^!?.]*)([!?.])/)) {   # while there are matches
print substr($0,RSTART,RLENGTH)            # output them
$0=substr($0,RSTART+RLENGTH)               # and move forward
}
}'

输出:

This is sentence!
This is sentence.

最新更新