Используя жемчуг совместимый regex с GNU grep-P

Ваш пример работает на меня при исключении фигурных скобок

$ tar --extract --file=test.tar.gz extract11

Если Ваш файл extract11 находится в подпапке, необходимо указать путь в tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11
10
02.10.2013, 22:50
3 ответа

Добавьте -o переключатель так, чтобы grep только возвраты, что соответствует шаблону, для которого Вы держите:

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

@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    

Используйте более простой regex и проанализируйте результаты:

$ 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
2
27.01.2020, 20:00

Можно также использовать sed без lookaround утверждения для большей мобильности (-o может не быть доступно для Вашего grep):

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

Отметьте "странное" использование Escape обратной косой черты здесь. Это вследствие того, что sed BREs использования по умолчанию (см. этот вопрос).

Разговор о мобильности, почему не только используют Perl?

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

Теги

Похожие вопросы