我想说我想在/usr/share/dict/words
中找到以c
开头并以er
结尾的所有12个字母的单词。在我的头顶,一个可行的模式可能看起来像:
grep -E '^c.{9}er$' /usr/share/dict/words
它找到了:
cabinetmaker
calcographer
calligrapher
campanologer
campylometer
...
但.{9}
困扰我。感觉太魔法,从原始约束中定义的数字中减去所有锚点字符的总长度。
有没有办法重写这个正则表达式,所以它不需要预先进行这个计算,允许在模式中直接使用文字12
?
答案 0 :(得分:2)
您可以使用-x
选项,该选项仅选择与整行完全匹配的匹配。
grep -xE '.{12}' | grep 'c.*er'
或使用-P
选项将模式阐明为Perl正则表达式并使用前瞻断言。
grep -P '^(?=.{12}$)c.*er$'
答案 1 :(得分:0)
您可以使用awk
作为替代方案并避免此计算:
awk -v len=12 'length($1)==len && $1 ~ /^c.*?er$/' file
答案 2 :(得分:0)
我不太了解grep
,但是一些更高级的NFA RegEx实现为您提供了前瞻和后瞻。如果你能找到任何方法让你可以使用它们,你可以写:
^(?=c).{12}(?<=er)$
也许像这样的perl
单行?
cat /usr/share/dict/words | perl -ne "print if m/^(?=c).{12}(?<=er)$/"
答案 3 :(得分:0)
使用GNU sed
的一种方法:
$ sed -nr '/^.{12}$/{/^c.*er$/p}' words
使用BSD sed
(Mac OS),它将是:
$ sed -nE '/^.{12}$/{/^c.*er$/p;}' words