我(?<=\[')[^,]*
在包含以下行的文件上使用此正則表達式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