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 

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,\}

  • Печать регулярного выражения Sed в файл .txt
  • Сопоставьте текущую строку до строки, которая не соответствует шаблону
  • оптимизировать команду с помощью or или pipe для анализа вывода ifconfig
  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • Как удалить строки в файле с определенной позиции до конца файла
  • Почему вывод этой команды вставки разделяется на отдельные строки с помощью отступов?
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • sed, конвертировать одиночную обратную косую черту в двойную обратную косую черту
  • Как удалить все числа, окруженные <>
  • Отфильтруйте содержимое буфера обмена без использования промежуточного файла
  • использование sed для замены шаблона с помощью хэш-значений
  • Linux и Unix - лучшая ОС в мире.