(?<=\[')[^,]*
私は次の行を含むファイルにこの正規表現を使用しています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