sed code для обработки текста

Может ли кто-нибудь объяснить мне это ниже sed code

sed -n ' /Policy Name:/! d s/.*:\s\+// h :1 n /Active:\s*no/d /HW\//!b1 :2 s/.*\s\(\S*\)\s*/\1/ G s/\n/\t/p n /^\s*$\|Include:/! b2 ' 

Я хочу отредактировать, чтобы добавить информацию «Тип политики:», когда я заменю его «Имя политики»: он отлично работает. Однако, когда я добавляю раздел, как показано ниже, он не работает явно, потому что я пытаюсь его без понимания.

 sed -n ' /Policy Name:/! d s/.*:\s\+// h :1 n /Policy Type:/! d s/.*:\s\+// h :1 n /Active:\s*no/d /HW\//!b1 :2 s/.*\s\(\S*\)\s*/\1/ G s/\n/\t/p n /^\s*$\|Include:/! b2 ' 

Также у меня есть решение для эквивалентного кода AIX ниже с того же форума, что и я, чтобы понять его, чтобы изменить его, чтобы добавить тип политики.

 # define constants SPC=`echo x | tr x '\040'` TAB=`echo x | tr x '\011'` NL= # custom regex for... s="[$SPC$TAB]"; # horizontal whitespace S="[^$SPC$TAB]"; # non-whitespace # POSIX compliant sed code... sed -ne " /Policy Name:/!d s/.*:$s\{1,\}// h :1 n /Active:$s*no/d /HW\//!b1 :2 s/.*$s\($S*\)$s*/\1/ G s/\n/$TAB/p n /^$s*\$/d /Include:/d b2 " yourfile 

Входной файл

 Policy Name: Today Policy Type: Standard Active: yes Effective date: 01/24/2014 11:17:05 Client Encrypt: no LC/CY/Custmr: EU NY Cindy BU CA Victor GU MI Bob Include: Policy Name: Tomorrow Policy Type: Oracle Active: yes Effective date: 01/26/2014 11:17:05 Client Encrypt: no LC/CY/Custmr: MU LA Martha EU CA Sam Include: Policy Name: Yesterday Policy Type: Oracle Active: no Effective date: 01/21/2014 11:17:05 Client Encrypt: no LC/CY/Custmr: NV IL Joe Include:` 

Желаемый результат

 Cindy Today Standard Victor Today Standard Bob Today Standard Martha Tomorrow Oracle Sam Tomorrow Oracle 

  • Получите первое соответствие шаблону в строке, не использующей разрез
  • В верхнем регистре только первая буква каждой строки
  • Каким образом можно фильтровать текстовый файл для удаления пустых строк?
  • sed: многострочная замена блока конфигурации
  • Извлечь третью группу текста из разделителей диапазонов
  • чтение списка строк из файла, записывающего вывод в утилиту
  • распечатать определенную строку из нескольких файлов
  • Как удалить все неупорядоченные строки из текстового файла?
  • One Solution collect form web for “sed code для обработки текста”

    Хорошо, давайте сделаем это шаг за шагом:

     sed -n ' 

    Опция -n делает вывод sed ничего, если не сказать так

     /Policy Name:/! d 

    Все строки, которые не содержат Policy name: удаляются. Остальная часть скрипта обрабатывается только в следующих циклах.

     s/.*:\s\+// h 

    Это удаляет все до : и конечных пробелов и помещает остальные в буфер хранения для последующего использования.

     :1 n 

    Это начало цикла, считывающего новые строки

     /Active:\s*no/d 

    Линии с таким шаблоном удаляются, поэтому, очевидно, нет интереса к инактивам

     /HW\//!b1 

    И теперь мы зацикливаемся на :1 если строка не содержит HW/

     :2 s/.*\s\(\S*\)\s*/\1/ 

    Начиная следующий цикл, удалите все, кроме последней последовательности не-пробелов.

     G s/\n/\t/p 

    Затем добавьте имя политики, хранящееся в буфере удержания, разделенное вкладкой и напечатайте эту строку

     n /^\s*$\|Include:/! b2 ' 

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

    Следует отметить, что это очень не переносимый код, который не будет работать во многих версиях sed .

    Изменить: Чтобы добавить тип политики в качестве третьего столбца, вы должны добавить эту строку в скрипт до или после Active: check:

     /Policy Type:/{s/.*:\s*//;H;} 

    То есть: Если строка содержит указанную строку, выполните команды между {} . Эти команды удаляют часть до : и завершающих пробелов и добавляют оставшуюся часть строки (которая должна содержать тип политики) в буфер удержания. Таким образом, буфер удержания содержит имя и тип политики, разделенные символом новой строки. Поэтому, когда мы добавим это с помощью G , будет заменена две новые строки, поэтому команде замены необходимо, чтобы флаг g заменил все вхождения:

     s/\n/\t/gp 

    Сценарий AIX в основном одинаков, но избегает расширений GNU для регулярных выражений. Главным образом переменные использования для соответствия пробелам или вкладкам, так как \t не будет работать во всех вкусах sed , а также + для «одного или нескольких» необходимо заменить на \{1,\}

    Interesting Posts

    Правильно удалите сокеты, случайно созданные с помощью tmux

    bash_profile останавливается после вызова файла

    Как выполнить псевдоним сразу после поиска его в одном лайнере?

    История команды bash, редактирующая несколько строк

    Проблема с использованием списков контроля доступа для новых пользователей, например (папка, созданная в skel directoy, имеет набор acl, она должна применяться к новым пользователям)

    Как добавить новый символ после каждой строки?

    Установка Docker на RedHat завершилась неудачей с 403 запрещенными

    Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?

    Можете ли вы иметь два правила перезаписи каталогов в одной конфигурации?

    Linux не выполняет синхронизацию при перезагрузке

    Возможно ли эхо-символы напрямую подключаться к сети?

    обнаружение датчиков не обнаруживает

    Копирование файла в файловой системе JFS не соответствует рекомендациям ACL

    Не удалось удалить Root CA (UNIX: операция не разрешена)

    Как вставить новые столбцы в CSV-файл?

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