在Ubuntu 17.10上的bash regex中出现负向前瞻问题

时间:2017-11-07 02:14:52

标签: regex bash grep

我有一个法语令牌的文件,每个都用换行符分隔。该文件名为fr_notime.txt,如下所示:

bonne-chance
d'
être
l'
heureux
élu
»
,
écrit
-
il
sur
sa
25

我希望丢失标点符号和数字,但不会像d'中那样失去收缩,也不会失去bonne-chance中的复合词,因此在同一个之间使用连字符或短划线。

我的解决方案是逐行读取文件,并根据其内容进行处理。我将以下内容写成.sh脚本 -

while IFS='' read -r line || [[ -n "$line" ]];
do
    if ( [[ $line =~ "[[:alpha:]]+'|-[[:alpha:]]+" ]] );
        then
          echo "$line : .............................................Exception"
        elif ( [[ $line =~ "[[:punct:]0-9]" ]] );
          then
            echo "$line : 11111111111 Digit or Punct"
          else
            echo "$line : Regular"
        fi
done < "fr_notime.txt"

Q1。这只是一个基本的脚本,可以知道我是否正确过滤它们,但不知怎的,它只是为每个标记返回Regular。有什么我想念的吗? PS-我试图删除;在if段之后,但无济于事。 在删除sh文件中的双引号后,此部分已解决。但是,第二季度仍然没有答案。

Q2。在尝试使用grep和perl regex在命令行上解决它时,我使用了以下代码 -

grep -P "(?![[:alpha:]]+'|-[[:alpha:]]+)[[:punct:]0-9]" fr_notime.txt | less

该命令始终返回,因为找不到匹配项。

我可能错了,但这两者都应该有一个共同点。我做错了什么和/或错过了什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

我喜欢使用perl正则表达式语法;

grep -vP "^\s*\d+\s*$|^\s*\W+\s*$" fr_notime.txt
bonne-chance
d'
être
l'
heureux
élu
écrit
il
sur
sa

正则表达式解释道。正在搜索两种模式;两者都使用^表示行的开头,$表示eol,而\ s *表示捕获任何空格。 \ d +找到一个或多个数字,\ W +找到一个或多个非单词,非空白字符。 grep选项,-v反转匹配,-P告诉grep使用perl语法。

-Cheers