我是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'
任何人都可以向我解释这个正则表达式代码或提供描述它的模式吗?
提前致谢!
答案 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
输出。
其次,要仅获取arg1
和arg2
后面的字词,您必须将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
等等。