我需要找到一个正则表达式,它会忽略 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
它期望该文件中的每一行有一个正则表达式。