grep正则表达式匹配后如何获取文本?

时间:2014-12-20 23:43:01

标签: bash grep

我是bash的新手,我想制作一个将单词翻译成其他语言的脚本。我有一个字典文件,其中有句子,如 Rower pte Bicycle 。每个句子都有另一行。我尝试做的是使用grep找到匹配:

if eval 'nohup grep "'$arg1' '$arg2' [A-Za-z]\+" /tmp/dict.txt > /dev/null'; then
    echo 'found match'
else 

我收到找到的匹配响应,但我在匹配后需要单词(或字符串)(arg1是Rower,而arg2是pte)。我想获取 Bicycle 并将其放入脚本变量中。

我在堆栈上找到的一些正则表达式也有问题。它看起来像这样:

sed -n -e 's!.*en.wikipedia.org/wiki/\(.*\)" title.*!\1!p'

任何人都可以向我解释这个正则表达式代码或提供描述它的模式吗?

提前致谢!

1 个答案:

答案 0 :(得分:2)

if eval 'nohup grep "'$arg1' '$arg2' [A-Za-z]\+" /tmp/dict.txt > /dev/null'; then
    echo 'found match'
else 

如果仔细观察,你会将grep的标准输出发送到/dev/null(即bit-bucket / no man's land)。要查看grep命令的结果,请将> /dev/null更改为2> /dev/null(只会将stderr发送到/dev/null删除重定向到完全/dev/null(例如摆脱> /dev/null)。请注意,在这种情况下,您会看到所有grep输出。

其次,要仅获取arg1arg2后面的字词,您必须将grep的结果分配给变量并解析以消除arg2之前的文字1}},或管道并直接解析它。

sed -n -e 's!.*en.wikipedia.org/wiki/\(.*\)" title.*!\1!p'

是一个简单的sed regex,其中普通分隔符/已被!替换,以防止与URL中的/发生冲突。它只是说找到字符串en.wikipedia.org/wiki/ 保存 \(...\)之间的到最后" title之后的内容,然后只更换那个混乱什么是保存(可能是URL的最后一部分 - 或 - pagename)。在替换的替换部分中使用表达式的保存的部分称为back reference。这是\1完成的。您可以使用多个分组,back reference使用\2等等。