忽略某些字符的正则表达式

忽略某些字符的正则表达式

我需要找到一个正则表达式,它会忽略 bib2bib 工具中使用的某些字符。例如:我需要找到任何出现的单词“muller”。还有像“Hello, my name is Michael M\"uller, how are you?”或“There is M\"{u}ller”这样的字符串

应该可以找到。

编辑:我需要它不仅适用于“muller”,而且适用于每个单词。

答案1

如果您想删除诸如\"and\"{和 之类的内容},则必须使用类似工具对输入文件进行预处理,sed然后再将其输入bib2bib.

例子:

 sed -e 's/\\"\{\|\\"\|\}//' input.bib > input.bib.preprocessed

或者专门将其转换\"{u}u

 sed -e 's/\\"{\(.\)}/\1/' -e 's/\\"//' input.bib > input.bib.preprocessed

答案2

完全便携式的解决方案可能如下所示:

n='
';printf %s\\n muller wright dummy >/tmp/patterns
tr '[:lower:][:upper:]' '[:upper:][:lower:]' </tmp/patterns |
paste '-d\n\n' - /tmp/patterns |
sed "N;s/./\\$n&/;:ul$n s/\(\n\)\(.\)\(.*\n\)\(.\)/\2\4\1\3/;tul"'
       s/\n//g;s/../[{}\\"]*[&]/g'

最后的输出sed如下所示:

[{}\"]*[mM][{}\"]*[uU][{}\"]*[lL][{}\"]*[lL][{}\"]*[eE][{}\"]*[rR]
[{}\"]*[wW][{}\"]*[rR][{}\"]*[iI][{}\"]*[gG][{}\"]*[hH][{}\"]*[tT]
[{}\"]*[Dd][{}\"]*[uU][{}\"]*[Mm][{}\"]*[mM][{}\"]*[Yy]

这将取决于内容图案仅是字母数字字符。如果图案例如,其中任何一个[]都需要进一步测试,以确保方括号正确地放置在各自的括号表达式中。

无论如何,根据相关示例:

[{}\"]*[mM][{}\"]*[uU][{}\"]*[lL][{}\"]*[lL][{}\"]*[eE][{}\"]*[rR]

...是一个正则表达式,将匹配包含以下任意内容的行muller或者Muller或者M"ulL\\\{"er

使用 GNU,sed您可以在其内部处理大小写转换sed,因此:

sed -E 's/([[:upper:]]?)([[:lower:]]?)/\1\L\1\2\U\2/g' patterns

...印刷...

mMuUlLlLeErR
wWrRiIgGhHtT
DduUMmmMYy

...完全充实,您可以获得与之前的tr|paste|sed组合相同的行为(除此之外,这样就可以正确处理前面提到的方括号问题了)仅使用 GNUsed即可:

sed -E '
    s/([[:lower:]]?)([[:upper:]]?)/\1\U\1\2\L\2/g
    s/[[:alpha:]]{2}|./[{}\\"]*[&]/g
' </tmp/patterns

答案3

您没有提到您以何种方式获取数据。要删除包含已发布模式的行,您可以使用grep

grep -v -E '(muller|M\\"uller|M\\"{u}ller)'

(请注意,需要\另一个转义。)要匹配具有给定模式的逆行,请省略-v.

要在文件中定义正则表达式,请使用grep's option -f,如下所示:

grep -v -E -f file-with-regexps

它期望该文件中的每一行有一个正则表达式。

相关内容