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 ' 

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

  • Как присоединиться к файлам с необходимыми столбцами в Linux?
  • Как переименовать несколько файлов в одной команде или скрипте в Unix?
  • символические ссылки python (также для себя) в usr / bin
  • Установка Dell R710
  • Что такое значение первой цифры в 0022, когда я запускаю umask на linux?
  • Автоматически устанавливать часовой пояс Linux в соответствии с местоположением
  •  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 

  • минимальные требования к графическому интерфейсу linux
  • Гость Virtualbox, действительно, очень медленный по SSH, VBoxHeadLess застрял в системном времени 99,9%
  • Как разрешить пользователю создавать каталог, но не создавать вспомогательную директорию
  • Как избавиться от фиктивного интерфейса?
  • Как интерпретировать трассировку события cpu_idle и cpu_frequency, зарегистрированное ftrace?
  • Является ли генерация дампа ядерной энергией?
  • 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,\}

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