将 Perl 兼容的正则表达式与 GNU grep -P 一起使用

将 Perl 兼容的正则表达式与 GNU grep -P 一起使用

(?<=\[')[^,]*在包含以下行的文件上使用此正则表达式disk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

我想要它回来OVS/sdasd/asdasd/asdasd/something.img

我该如何使用grep才能使其发挥作用?

我已经尝试过grep -P "(?<=\[')[^,]*",但它返回整行。

答案1

添加-o开关,以便grep仅返回与您正在查找的模式匹配的内容:

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

答案2

您还可以sed在不使用环视断言的情况下使用以获得更大的可移植性(-o可能不适用于您的grep):

sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt

请注意此处反斜杠转义的“奇怪”使用。这是因为sed默认情况下使用 BRE(请参阅这个问题)。

说到可移植性,为什么不直接使用 Perl 呢?

perl -nle "print \$1 if /\['([^,]*)/" data.txt

答案3

@slm 已经给了你规范的答案。这里还有几个选项:

使用awkand'作为字段分隔符(假设所有行具有相同的格式):

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

在 perl 中完成整个事情:

$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt 
OVS/sdasd/asdasd/asdasd/something.img, w    

使用更简单的正则表达式并解析结果:

$ grep "\[.*\]" data.txt | awk -F "'" '{print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep -o "\[.*\]" data.txt | perl -pe "s/[\[\]']//g"
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | sed 's/.*\[.\(.*\).\]/\1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -pne 's/.*\[.(.*?).\].*/$1/'
OVS/sdasd/asdasd/asdasd/something.img, w
$ grep "\[.*\]" data.txt | perl -lne 'print $1 if /\[.(.*?).\]/'
OVS/sdasd/asdasd/asdasd/something.img, w

相关内容