繁体   English   中英

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

[英]How to find and print all AWK matches in bash?

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

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.

或 GNU grep for -o

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

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

你需要一个while()match()

$ 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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM