如何使用grep命令正确使用正则表达式组捕获?

时间:2018-06-02 04:33:25

标签: bash grep

我有这样的文字:

Paket telah dikirim melalui TIKI, no.resi 885000130000, Cek status pesanan di https://tiki.id/resi/

我想要只查看885000130000部分,这就是我尝试的内容:

echo "$text" | grep -Eo 'Paket telah dikirim melalui TIKI, no\.resi (.*),'

但结果总是

Paket telah dikirim melalui TIKI, no.resi 885000130000, 

我只想让grep只显示数字885000130000。我该怎么做?

5 个答案:

答案 0 :(得分:1)

<强>解决:

echo "$text" | grep -oP 'Paket telah dikirim melalui TIKI, no\.resi \K(\d+)'

答案 1 :(得分:1)

如果您的字符串/ Input_file与显示的示例相同,那么下面的内容也可以为您提供帮助。

awk '{sub(/.*no.resi /,"");sub(/,.*/,"")} 1' Input_file

答案 2 :(得分:1)

如果这不是你所需要的全部:

$ awk '{print $7+0}' file
885000130000

然后编辑您的问题以澄清您的要求。如果您需要匹配该字符串的其余部分,则可能需要其中任何一个:

$ awk '/Paket telah dikirim melalui TIKI, no\.resi/{print $7+0}' file
885000130000

$ awk 'sub(/Paket telah dikirim melalui TIKI, no\.resi/,""){print $0+0}' file
885000130000

这取决于您的要求的未说明的细节。上述任何一个都可以高效,健壮,可移植地与任何UNIX机器上的任何shell中的任何awk一起使用,并且如果/当您的需求发生变化时,这些awk很容易修改。

答案 3 :(得分:0)

使用sed,您只能打印包含-n选项后跟.../p的行。 此解决方案仅显示每行一个匹配。

echo "${text}" | sed -n 's/.*Paket telah dikirim melalui TIKI, no\.resi (.*),.*/\1/p'

在您当前的示例中,您只需要所有数字:

echo "${text}" | grep -Eo "[0-9]*"

或(当你有其他数字时)使用2 grep's

echo "${text}" | 
   grep -Eo 'Paket telah dikirim melalui TIKI, no\.resi [0-9]*,' | grep -Eo "[0-9]*"

答案 4 :(得分:0)

awk -F'[, ]' '{print $8}' file

output
885000130000