Arhn - архитектура программирования

получить строку между -( и )-, каталог linux

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

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

и вернуться:

  • фдсд
  • Джуджу gfdgf b
  • 64fsdfds
  • a ...

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

grep -Rn "-(" *

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

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

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

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

12.12.2011

Ответы:


1
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": со страницы руководства grep:

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

12.12.2011

2

Используйте ack:

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

Детали регулярного выражения:

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

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

12.12.2011

3

Поскольку вы предложили использовать программу 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
12.12.2011
  • Много переборщить? echo $STRING | perl -pe 's/[^(]*\(([^)]*)\)[^(]*/$1\n/g' 12.12.2011
  • Ваше решение не обрабатывает случаи, когда '(' по какой-то причине находится сам по себе (например, в комментарии о каталоге -(dirname)- находится в данных). Хотя ваше решение правильно анализирует данную строку, я хотел убедитесь, что мое решение (или «излишнее», как вы его называете) было полезно в более общих приложениях. 13.12.2011

  • 4

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

    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
    
    12.12.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..