Извлечение многострочного регулярного выражения без вкладок

Я пытался взломать небольшой скрипт для извлечения кода, но я не могу заставить его работать.

Моя цель – изучить все .txt-файлы в каталоге. Если он содержит строку, которая не начинается с вкладки и включает cat. *. C, затем извлекайте строки оттуда (эксклюзивные) до последней строки, которая начинается с} (включительно) и сохраняет ее в файл с одинаковыми именами как источник, за исключением расширения .c.

Мой первый удар в попытке найти это было так:

find . -name "*.txt" -print0 | xargs -0 awk '/[^ \t]cat .*.c/,/[^ \t]}/' 

Я не уверен, почему, но совпадение вкладок не работает.

Очевидно, мне нужно будет немного поработать. Мне нужно перебрать файлы из find и захватить каталог и имя файла …

 filename=$(basename "$1") filename="${filename%.*}" dirname=`dirname "$1" 

Во-первых, однако, мне нужно выяснить, как получить текст, который я хочу. Является ли awk подходящим инструментом для работы? Будет ли sed / grep лучшим выбором?

Любая помощь очень ценится! Спасибо!

PS Я пробовал искать, но проблема с вкладками, кажется, уникальна для меня. И однобокое сопоставление (ex / inclusive), как представляется, также редко используется …

2 Solutions collect form web for “Извлечение многострочного регулярного выражения без вкладок”

Если я правильно понимаю, вы хотите что-то вроде:

 awk ' NR==1, !/^[ \t]/ && /cat.*\.c/ {next} {a = a $0 "\n"} /^\}/ {printf "%s", a; a=""}' 

И интегрироваться с поиском:

 find . -name '*.txt' -type f -exec awk ' FNR == 1 { if (newfile != "") close(newfile) newfile = FILENAME sub(/\.txt$/, ".c", newfile) a = "" } FNR==1, !/^[ \t]/ && /cat.*\.c/ {next} {a = a $0 "\n"} /^\}/ {printf "%s", a > newfile; a = ""}' {} + 

Наконец, было время, чтобы поиграть с ответом. Вот мой «окончательный» сценарий, на случай, если кто-то найдет его полезным:

 for i in `find . -name '*.txt' -type f` do awk ' FNR == 1 { if (newfile != "") close(newfile) newfile = FILENAME sub(/\.txt$/, ".c", newfile) a = "" } FNR==1, !/^[ \t]/ && /cat.*\.c/ {next} {a = a $0 "\n"} /^\}/ {printf "%s", a > newfile; a = ""}' $i filename=$(basename "$i") filename="${filename%.*}" dirname=`dirname "$i"` cfilename="${dirname}/${filename}.c" if [ -f ${cfilename} ] then echo "Extracted code from: ${dirname}/${filename}.txt" gccErrors=`gcc -Wall ${cfilename} -o "${dirname}/${filename}" -lm 2>&1` if [ -n "${gccErrors}" ] then echo ${gccErrors} gccErrorFile="${dirname}/${filename}_GCCERRORS.txt" if [ -f ${gccErrorFile} ] then echo "Can't write to \"${gccErrorFile}\" File already exists!" else echo ${gccErrors} > ${gccErrorFile} fi fi fi done 
  • Grep, начиная с фиксированного текста, до первой пустой строки
  • Как найти и заменить значение столбца поля в UNIX
  • Как сохранить переменные в скрипте, который может быть разделен между двумя прогонами awk в отношении того же входного файла в скрипте?
  • Текст между двумя тегами
  • используя команду awk, чтобы сравнить два файла и распечатать все столбцы, а затем отобразить как NA
  • Соответствие регулярных выражений на awk в командной строке
  • Bash для эхо-первого позиционирования каждой строки в файл с именем второго
  • Как извлечь часть текста из файла?
  • Awk: if и условное выражение в том же блоке
  • Присоединиться: два файла - но только добавить последние два столбца
  • Скрипт, сравнивающий два файла, соответствует двум строкам в любой точке
  • Interesting Posts

    autofs core dumps после настройки /etc/autofs/autofs_ldap_auth.conf

    Как изменить имя хоста в Fedora 21

    Добавить временную метку unix в файлы с пространством, используя скрипт

    MariaDB принимает любой пароль

    Запустить sudo интерактивный сеанс в текущем каталоге?

    Сопоставьте символ с определенным ключом

    Числовая сортировка по значениям столбца

    Как установить групповую политику для доступа ко всем папкам, кроме одного?

    Почему изменение настроек tty в одном файловом дескрипторе влияет на другое?

    Как удалить фрагмент диска с помощью Ubuntu?

    Как я могу зарегистрировать свой интернет-трафик, сгруппированный по IP-адресу / имени хоста, порту и т. Д.?

    запускать несколько значений из файла по одной команде один за другим

    Заказ между `nohup`,` & `и перенаправление?

    В чем разница между использованием netcat (nc) и curl для HTTP-запросов?

    Изменение размера xterm заставляет оболочку испортить

    Linux и Unix - лучшая ОС в мире.