получить строку между "- (" и ") -", каталог linux - PullRequest
2 голосов
/ 12 декабря 2011

У меня в каталоге Linux много файлов, простой текст с некоторыми каталогами, и я хочу найти во всех этих файлах и получить точно строку между "- (" и ") -", например:

bbbfb da bg - (fdsd) - fgfjmui - (juju gfdgf b) - fsdf sdfs dsfdlk, kwwk
xwpv - (64fsdfds) - fsdfsd - (a) - fsdfsd ...

и возврат:

  • fdsd
  • juju gfdgf b
  • 64fsdfds
  • a ...

Я некоторое время читал, и я нашел такие команды, как grep, но я попытался, и я думаю, что эта команда возвращает ровно строку и только одну строку:

grep -Rn "-(" *

Я попробовал также команду sed, например:

sed -e 's/.*-(\([^"]*\))-.*/\1/'

, которые возвращают все строки и где находится шаблон, только строка внутри - (и) -, но не совсем верно.

я читал о awk, но мойвопрос: возможно с grep, sed или awk?Есть ли еще что-то, что можно поставить по команде sed?(я новичок в этом) есть другая команда, чтобы сделать это?или другая идея, о которой я думал, это сделать небольшую программу на c для чтения файлов char на char

Ответы [ 4 ]

6 голосов
/ 12 декабря 2011
grep -RPo '(?<=-\()[^)]*(?=\)-)' yourDir

это даст вам нужные вам строки каждая на строку

тест на вашем примере:

kent$  echo "bbbfb da bg -(fdsd)- fgfjmui -( juju gfdgf b)- fsdf sdfs dsfdlk,kwwk xwpv -(64fsdfds)- fsdfsd -(a)- fsdfsd..."|grep -Po '(?<=-\()[^)]*(?=\)-)'
fdsd
 juju gfdgf b
64fsdfds
a

Хитрость здесь в том, что "o": из man-страницы grep:

-o, -подходящий Печатайте только совпадающие (непустые) части совпадающей строки, каждая из которых находится на отдельной выходной строке.

2 голосов
/ 12 декабря 2011

Использование ack:

ack -o -h '(?<-\().*?(?:\)-)'

Сведения о регулярном выражении:

(?<-\() : lookbehind assertion : dash and opening parenthese
.*? : as few characters as possible
(?:\)-) : lookahead assertion : closing parenthese and dash.

Если ваши файлы не приходят, используйте переключатель -a для неограниченного поиска. Опции программы доступны по указанной ссылке.

1 голос
/ 12 декабря 2011

Поскольку вы предложили использовать программу на C, я думаю, что предложение perl может быть полезным Использование perl дает вам доступ к не жадным регулярным выражениям / подстановкам.

STRING='bbbfb da bg -(fdsd)- fgfjmui -( juju gfdgf b)- fsdf sdfs dsfdlk,kwwk xwpv -(64fsdfds)- fsdfsd -(a)- fsdfsd'
echo $STRING | perl -pe 's/.*?-\(//; s/\)-.*?-\(/\n/g; s/\)-.*?$//;'

Вот вывод для этого в моей системе

> ./foo.sh 
fdsd
 juju gfdgf b
64fsdfds
a
0 голосов
/ 13 декабря 2011

Это может работать для вас:

cat <<! | sed '/[^-]*-(\([^)]*\))-[^-]*/!d;s//\1\n/g;s/.$//'
bbbfb da bg -(fdsd)- fgfjmui -( juju gfdgf b)- fsdf sdfs dsfdlk,kwwk
xwpv -(64fsdfds)- fsdfsd -(a)- fsdfsd...
!
> bbbfb da bg -(fdsd)- fgfjmui -( juju gfdgf b)- fsdf sdfs dsfdlk,kwwk
> xwpv -(64fsdfds)- fsdfsd -(a)- fsdfsd...
> !
fdsd
 juju gfdgf b
64fsdfds
a
...