Использование sed / awk для изменения слов между двумя шаблонами

Я пишу сценарий оболочки, который должен обрабатывать какой-то текст, у меня есть текст:

read build { file1 file2 file3 } check build { file2 file3 file4 } read build { file4 file5 file6 } 

Я хочу добавить текст перед всеми файлами – это слова, которые включены между скобками в строках «read build», как вы думаете, это лучшая идея для достижения этого? Результаты должны выглядеть так:

 read build { MY_ADDED_WORDfile1 MY_ADDED_WORDfile2 MY_ADDED_WORDfile3 } check build { file2 file3 file4 } read build { MY_ADDED_WORDfile4 MY_ADDED_WORDfile5 MY_ADDED_WORDfile6 } 

Я пытался с помощью greping использовать эти строки, а затем разбирал их с массивом и объединял строки «file» со словом, которое я хочу добавить, но я думаю, что это не «умное» решение. Спасибо за вашу помощь.

Входные файлы выглядят следующим образом:

 set build { file1 file2 file3 file4 } check $build read build -new -f $build read build -new -f { fileA fileB fileC fileD } set build {file5 file6 file7 } read build -old -f $build read build -old -f { fileX fileZ fileD } check_that_building 

Результат должен выглядеть так:

 set build { file1 file2 file3 file4 } check $build read build -new -f $build read build -new -f { MY_ADDED_WORDfileA MY_ADDED_WORDfileB MY_ADDED_WORDfileC MY_ADDED_WORDfileD } set build {file5 file6 file7 } read build -old -f $build read build -old -f { MY_ADDED_WORDfileX MY_ADDED_WORDfileZ MY_ADDED_WORDfileD } check_that_building 

Всегда есть место перед открытием скобки, но это может быть ситуация, когда после открытия кронштейна не будет места, там может быть пространство перед закрывающей скобкой, но это не всегда. Возможные случаи:

 read build -old -f { fileX fileZ fileD } read build -old -f {fileX fileZ fileD } read build -old -f { fileX fileZ fileD} read build -old -f {fileX fileZ fileD} 

One Solution collect form web for “Использование sed / awk для изменения слов между двумя шаблонами”

Я не мог сразу понять, как это сделать в sed не предполагая, что есть хотя бы один символ, который, как известно, никогда не появляется на входе. Я предположил, что # никогда не появится на входе (или в вашем добавленном слове). Это похоже на работу:

 sed '/read build/ { s/{/{ / : fruit s/\({.*\) \([^}# ][^ ]*\)/\1#MY_WORD\2/ t fruit s/#/ /g s/{ /{/ }' 

В строках, которые содержат read build он сначала вставляет пробел после { . Затем он ищет пробел, который находится где-то после { и непосредственно перед словом (предположительно имя файла). Он заменяет пространство # , вставляет ваше слово и возвращается и ищет больше. ( fruit – это произвольная метка цикла.) После того, как все они найдены, он превращает все символы # в пробелы и удаляет вставленное им пространство (после { ).

В дополнение к бит о # не встречающемся во входе, это предполагает, что

  • } является последним непустым символом для каждой строки read build , и
  • пробелы – это пробелы; нет вкладок.

В awk :

 awk '/read build/ { in_braces=0 for (i = 1; i <= NF; i++) { if ($i == "{") in_braces=1 else if (substr($i,1,1) == "{") { $i = "{MYWORD" substr($i,2) in_braces=1 } else if ($i == "}") in_braces=0 else if (in_braces) $i = "MY_WORD" $i } } { print }' 

Для каждой read build строки read build она проходит через все слова (поля) в строке. Он использует переменную состояния ( in_braces ), чтобы отслеживать, находится ли она между { и a } ; если это так, он изменяет каждое слово, чтобы начать с вашего добавленного слова. Обратите внимание, что он должен обрабатывать два несколько разных случая:

  • если слово равно { , установите флаг, чтобы начать изменять все последующие слова, и
  • если слово начинается с { , это на самом деле соединение формы { fileX , поэтому измените его как конкатенацию { , добавленное слово и имя файла fileX . А также установите флаг для изменения всех последующих слов.

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

 read build { file1 file2 file3 } 

будет производить выход

 read build { MY_WORDfile1 MY_WORDfile2 MY_WORDfile3 } 

Кроме того, это предполагает, что

  • { находится в начале слова (т. е. перед ним пробелы), и
  • либо } является последним непустым символом для каждой строки read build , либо это отдельное слово (т. е. имеет пробелы до и после)

Он позволяет несколько наборов фигурных скобок; например,

 read build { file1 file2 file3 } text to be left alone { file4 file5 file6 } 
  • Как сделать + работать в регулярных выражениях sed на FreeBSD?
  • Преобразование одного (длинного) столбца в несколько (коротких) столбцов с неравными длинами
  • Группируйте все строки на основе первого столбца, затем вычислите общее количество второго и третьего столбцов
  • как удалить строку из файла XML
  • Измените несколько строк файла XML с помощью командной строки
  • Как разобрать этот вывод и поместить его в массив?
  • Удаление файлов, если содержимое не соответствует шаблону
  • Извлекать и удалять первое вхождение XML-тега несколько раз
  • Sed + как установить параметры в команде sed, чтобы отображать строки из текстового файла
  • заменяя многострочную строку другой многострочной строкой, используя sed
  • Изменить путь в sql-скрипте с помощью sed
  • Interesting Posts

    Замена для php5-auth-pam для аутентификации входа в сайт для локальных пользователей

    Перемещение дерева процессов

    Ли Linux все еще применяет ограничение отслеживания соединений?

    Потерянный каталог справочника ls после сбоя

    рекурсивный mkdir

    logrotate :: Как удалить старые журналы в файле журнала после того, как размер файла журнала достигнет размера 1M

    Вставить после второго шаблона в sed

    pgrep для процессов, которые не связаны с терминалом в ubuntu

    Статистика пропускной способности Wi-Fi для каждой сети?

    Как получить дополнительную информацию о загрузочном сообщении «Ожидание / dev для полного заполнения»

    Показать ip на boot – centos 7

    Как написать вывод на экран из службы systemd во время загрузки?

    Проблемы с сервером

    Как преобразовать эти данные в назначения с помощью awk или другого?

    Каковы различные способы установки прав доступа к файлам и т. Д. На gnu / linux

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