我想打印所有包含两个相同单词的句子。 句子以 结尾。或者 ?或!
对于输入:
word ja ba word. Na Na word wdd? Nothing kkk
ok ok! word no this no word. ok ok. notok!
输出应该是:
Na Na word wdd?
Nothing kkk
ok ok!
ok ok.
到目前为止,这是我的代码:
#!/bin/bash
if [ $# -eq 0 ]
then
echo "No arguments"
fi
if [[ -f $1 ]] #if its file
then
cat $1 | awk '{
for (i=1;i<=NF;i++)
{
}}'
fi
我不知道如何用 AWK 分隔完整的句子。我不能使用多文件分隔符(!这很重要)。如果我把它们分开,如何检查里面的每一个字?我需要使用 AWK。
这是我最新的想法:
cat $1 | awk '{
for (i=1;i<=NF;i++)
{
a=0;
if ($i ~ "\?$" || $i ~ "\!$" || $i ~ "\.$")
{
#print $i;
k='';
for(j=$i; j!=$a; j--);
{
if( $j == $k)
#print whole sentence
$k=$j;
}
}
}}'
我找到了以?/./!结尾的单词,然后检查最后一句之前的所有单词
最佳答案
grep
足以做到这一点:
grep -Pzo "[^.?!]*\b(\w+) \1[^.?!]*"
测试:
$ echo '''word ja ba word. Na Na word wdd? Nothing kkk
ok ok! word no this no word. ok ok. notok!''' | grep -Pzo "[^.?!]*\b(\w+) \1[^.?!]*"
Na Na word wdd
Nothing kkk
ok ok
ok ok
解释:
-o
标志使得grep
只返回匹配的结果,而不是它出现的行-P
标志使grep
使用 PCRE 正则表达式-z
标志抑制行尾的换行符,将其替换为 nul 字符。也就是说,grep 知道行尾在哪里,但将输入视为一大行。[^.?!]*
匹配句子的开头:它将匹配尽可能多的字符,但不匹配句子终止符 (.?!)\b(\w+)
匹配单词字符,并将它们分组在正则表达式的第一组中。单词边界确保我们不仅匹配单词的结尾(感谢 123!)。\1
引用第一组,所以我们必须有两个相同的单词,用空格分隔[^.?!]*
匹配句尾
关于Linux ubuntu awk。找到包含 2 个相同单词的句子放在它们附近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37322516/