(?<=\[')[^,]*
次の行を含むファイルでこの正規表現を使用しています。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
ここでエスケープされたバックスラッシュの「奇妙な」使用に注意してください。これはsed
BREがデフォルトで使用されるためです(参照:この問題)。
移植性について言えば、なぜ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