提取包含问号的单词

时间:2017-03-06 13:48:15

标签: regex

我有几十个很长的文本文件(每个10k到100k记录),其中一些字符因粗心处理而丢失,并被问号取代。我需要建立一个损坏的单词列表。

我确定最有效的方法是使用sed或awk或其他一些bash工具对文件进行正则表达式,但是我无法编写可以执行此操作的正则表达式。

以下是几个要处理的样本记录:

?ilkin, Aleksandr, Zahhar, isa
?igadlo-?van, Maria, Karl, abikaasa, 27.10.45, Veli?anõ raj.

所需的输出将是:

?ilkin
?igadlo-?van
Veli?anõ

到目前为止,我最好的结果似乎只能从记录开头检索单词:

awk '$1 ~/\?/ {print $1}' test.txt

- >

?ilkin,
?igadlo-?van,

1 个答案:

答案 0 :(得分:1)

  

我需要建立一个损坏的单词列表

如果目标只是搜索匹配grep,那么它将是最快速,最强大的工具:

grep -Po '(^|)([^?\s]*?\?[^\s,]*?)(?=\s|,|$)' test.txt

输出:

?ilkin
?igadlo-?van
Veli?anõ

解释

-P选项,允许 perl 常规表达

-o选项,告诉只打印匹配的子字符串

(^|) - 匹配字符串的开头或空值(在这种情况下我们不能使用字边界锚\b因为问号?被视为字边界)

[^?\s]*? - 匹配除?以外的任何字符和\s空格

\?[^\s,]*? - 匹配问号?,后跟除空白\s,之外的任何字符(可以在右边界处)

(?=\s|,|$) - 前瞻性肯定断言,确保所需子字符串后面跟空格\s,逗号,或放在字符串末尾