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

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

(?<=\[')[^,]*次の行を含むファイルでこの正規表現を使用しています。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より移植性のためにLookaroundアサーションなしで使用することもできます(-oこれは機能しない可能性がありますgrep)。

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

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

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

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

答え3

@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

関連情報