Використання сумісного perge-регексу з GNU grep -P


10

Я використовую цей регулярний вираз (?<=\[')[^,]*у файлі, що містить наступний рядокdisk = ['OVS/sdasd/asdasd/asdasd/something.img, w']

Я хочу, щоб це повернулося OVS/sdasd/asdasd/asdasd/something.img

Як я можу використовувати grepйого для роботи?

Я спробував, grep -P "(?<=\[')[^,]*"але це повертає всю лінію.

Відповіді:


14

Додайте -oперемикач, щоб grepвін повертав лише те, що відповідає шаблону, який ви шукаєте:

$ grep -Po "(?<=\[')[^,]*" data.txt 
OVS/sdasd/asdasd/asdasd/something.img

6

Ви також можете використовувати sedбез твердження про орієнтування для більшої портативності ( -oможливо, недоступна для вашої grep):

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

Зверніть увагу на "дивне" використання зворотної косої риски тут. Це пов'язано з тим, що sedза замовчуванням використовується BRE (див. Це питання ).

Якщо говорити про портативність, то чому б просто не використовувати Perl?

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

2

@slm вже дав вам канонічну відповідь. Ось ще кілька варіантів:

Використовуйте awkі 'як роздільник поля (якщо припустимо, що всі рядки мають однаковий формат):

$ awk -F "'" '($1~/ = /){print $2}'
OVS/sdasd/asdasd/asdasd/something.img, w    

Робіть все в перл:

$ 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.