我(?<=\[')[^,]*
在包含以下行的文件上使用此正则表达式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 已经给了你规范的答案。这里还有几个选项:
使用awk
and'
作为字段分隔符(假设所有行具有相同的格式):
$ 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