提取最值-使用-grep的

时间:2010-11-03 10:14:26

标签: linux bash shell

来自extracting the values using grep

Reading:RG1:+ /user/reading-2/Monday:12
Reading:RG1:- /user/**/Friday:12
Reading:RG1:- /user/**/*.txt:12
Reading:RG1:- /user/tet-23/**/*.txt:12
Reading:RG2:+ /user/reading-2/Monday:12
Reading:RG2:- /user/**/Friday:12
Reading:RG2:- /user/**/*.txt:12
Reading:RG2:- /user/tet-23/**/*.txt:12

我试过这个: cat a.txt | grep RG1 | grep' - '| cut -d':' - f3- | cut -d'-'-f2 | sed -e's / //'

这不会起作用,因为它会提取错误的路径,因为某些+也有 -

如何重新解决此问题

5 个答案:

答案 0 :(得分:2)

试试这个:

egrep "^[^:]*:RG1:-" a.txt | cut -d: -f3 | cut -b3-

示例运行:

$ cat a.txt 
Reading:RG1:+ /user/reading-2/Monday:12
Reading:RG1:- /user/**/Friday:12
Reading:RG1:- /user/**/*.txt:12
Reading:RG1:- /user/tet-23/**/*.txt:12
Reading:RG2:- /user/tet-23/**/*.txt:12
Reading:RG2:+ /user/reading-2/Monday:12
$ egrep "^[^:]*:RG1:-" a.txt | cut -d: -f3 | cut -b3-
/user/**/Friday
/user/**/*.txt
/user/tet-23/**/*.txt

"^[^:]*:RG1:-"表示“从:以外的任何内容开始零次或多次,然后是:,然后是RG1,后跟-

答案 1 :(得分:1)

您可以尝试获取完整的“RG1:+”字符串,然后按空格剪切,例如:

grep "RG1:+" a.txt | cut -d" " -f2

答案 2 :(得分:1)

尝试使用sed

sed -r -e '/:RG1:/s/.*:[+-] //;s/:[0-9]+$//' a.txt

仅适用于其中包含:RG1:的行。您可以对所有行进行概括:

sed -r -e 's/.*:[+-] //;s/:[0-9]+$//' a.txt

或者只是带有RG和数字的行

sed -r -e '/:RG[0-9]+:/s/.*:[+-] //;s/:[0-9]+$//' a.txt

如果你想保留尾随:12只是省略最后的替换,例如:

sed -r -e '/:RG[0-9]+:/s/.*:[+-] //' a.txt

答案 3 :(得分:0)

如果Perl被赋予了   - 或+

perl -nE 'say $1 if /\AReading:RG[1-9]:[+-]\s+(.*)\Z/' file

-

perl -nE 'say $1 if /\AReading:RG[1-9]:-\s+(.*)\Z/' file

答案 4 :(得分:0)

根据我之前提出的问题的答案尝试这种变化:

grep -Po '(?<=RG1:- ).*(?=:\d*$)' a.txt