我有几十个很长的文本文件(每个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,
答案 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
,逗号,
或放在字符串末尾