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 для обучения системных администраторов
  • Fix-клавиши для подсветки клавиатуры
  • Отправить javascript для Chromium или Firefox из linux terminal
  • Как разделять строки в огромном файле данных на основе количества столбцов внутри них в Linux?
  • Только разрешение на файл
  • Создание нескольких входных файлов с помощью sed в цикле for
  •  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 

  • Разделение диска 2tb
  • Заменить шаблон в файле с содержимым другого файла
  • Могу ли я использовать PXE без DHCP, просто указав статический IP-адрес вручную?
  • Как Linux-серверы обновляют свое ядро ​​без перезагрузки
  • Использование `sed` в Android без модификатора` g`?
  • защита паролем для сжатия logrotate
  • 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 - лучшая ОС в мире.