將 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

相關內容