Odpowiedzi:
Można również użyć sed
bez potwierdzenia, aby zapewnić większą przenośność ( -o
może nie być dostępne dla Twojego grep
):
sed "s!['\(\[^,\]*\),.*\$!\1!;t;d;p" data.txt
Uwaga: „dziwne” użycie odwrotnego ukośnika ucieka tutaj. Wynika to z faktu, że sed
domyślnie korzysta z BRE (patrz to pytanie ).
Mówiąc o przenośności, dlaczego nie skorzystać z Perla?
perl -nle "print \$1 if /\['([^,]*)/" data.txt
@slm już dał ci odpowiedź kanoniczną. Oto kilka innych opcji:
Użyj awk
i '
jako ogranicznika pola (zakładając, że wszystkie wiersze mają ten sam format):
$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w
Zrób wszystko w Perlu:
$ perl -lne 'print $1 if /\[.(.*?).\]/' data.txt
OVS/sdasd/asdasd/asdasd/something.img, w
Użyj prostszego wyrażenia regularnego i przeanalizuj wyniki:
$ 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