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

grep しているパターンに一致するものだけが返される-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

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

移植性について言えば、なぜ 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

関連情報