正则表达式尝试在反斜杠/不工作之前匹配所有内容

时间:2016-05-11 00:18:27

标签: regex linux

我正在尝试使用正则表达式匹配/之前的所有内容,但是当我尝试以下操作时,我什么都没输出。我仔细检查了我的正则表达式,看起来没问题,但不确定为什么它不起作用..

[user@user my_dir]$ tar -tf abc_de123_01.02.03.4.tgz | grep -m1 /
abc_de123_01.02.03.4/abcde.ini
[user@user my_dir]$ tar -tf abc_de123_01.02.03.4.tgz | grep -m1 .*\/
[user@user my_dir]$ tar -tf abc_de123_01.02.03.4.tgz | grep -m1 /$

expected output:
abc_de123_01.02.03.4/

2 个答案:

答案 0 :(得分:2)

这里有三个问题。

  • 一个问题是*对你的shell有特殊意义;如果您运行echo grep -m1 .*\/,则会发现您的shell正在以您不期望的方式展开.*\/

  • 一个问题是grep默认打印匹配。如果您希望它只打印一行的匹配部分,则需要-o标记。

  • 一个实际上没有破坏你的命令的问题,但你应该修复的问题是你的shell使用\作为引用(转义)字符,所以\/实际上只意味着/。 (这并没有打破任何事情的原因是/无论如何都不是特别的grep,所以你实际上并不需要\来获取任何东西。)

所以:

grep -m1 -o '.*/'

找到包含/的第一行,并在该行的最后一行/上打印所有内容。

顺便提一下,/不是反斜杠,而只是斜杠(或者有时是正斜杠)。 反斜杠\

答案 1 :(得分:0)

默认情况下,Grep适用于行式操作。如果您只需要在所有行中使用部分字符串,则可以使用cut。

tar -tf abc_de123_01.02.03.4.tgz | cut -d'/' -f1 

现在,如果你只需要第一场比赛的第一部分,那就是sed:

tar -tf abc_de123_01.02.03.4.tgz | sed "1q;d" | cut -d'/' -f1