Linux ubuntu awk。找到包含 2 个相同单词的句子放在它们附近

标签 linux bash awk

我想打印所有包含两个相同单词的句子。 句子以 结尾。或者 ?或!

对于输入:

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/

相关文章:

bash - Sed/Awk : Delete all lines after last occurrence of pattern

c - 海湾合作委员会正则表达式

linux - 用于分析目的的编译选项

c - 确定运行当前进程的用户

bash - 如何使用 shell 脚本判断 postgres 数据库表是否存在

python - 无法使用 Fabric 和 nohup 真正后台 SSH 隧道

bash -\r 在 awk 的 printf 中不起作用?

linux - 如何使用 recvfrom() 获取 recvmsg() 返回的标志

bash - 为什么 `sort file > file` 会导致一个空文件?

bash - 将 key=value 对解析为变量