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

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

Моя цель – изучить все .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), как представляется, также редко используется …

  • Удалить целую строку, если после ":" меньше 4 символов
  • Извлечение столбцов из огромного текстового файла с разделителями
  • ошибка в awk / sed использование манипуляций с файлами по очереди
  • заменить содержимое одного поля на основе содержимого в другом поле
  • Помощь с повторением поля A в CSV-файле, где поле B имеет указанное значение
  • Как напечатать конкретный столбец с awk на удаленном сеансе ssh?
  • setenv из awk в tcsh
  • Извлечь часть одной строки и отсортировать
  • 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 
    Linux и Unix - лучшая ОС в мире.