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