GNU grep -PでPerl互換の正規表現を使用する


10

(?<=\[')[^,]*次の行を含むファイルでこの正規表現を使用していますdisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

戻って欲しい OVS/sdasd/asdasd/asdasd/something.img

grepそれを機能させるにはどうすればよいですか?

私は試しましたgrep -P "(?<=\[')[^,]*"が、それは行全体を返します。

回答:


14

-oスイッチを追加して、grepgreppingするパターンに一致するものだけを返すようにします。

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

6

sed移植性を高めるためにlookaroundアサーションなしで使用することも-oできます(で使用できない場合がありますgrep)。

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

ここでは、バックスラッシュエスケープの「奇妙な」使用に注意してください。これsedは、デフォルトでBRE を使用しているためです(この質問を参照)。

移植性と言えば、Perlを使用しないのはなぜですか?

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

2

@slmはすでに標準的な答えを提供しています。さらにいくつかのオプションがあります:

awkおよび'フィールド区切り文字として使用(すべての行が同じ形式であると想定):

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.