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 ...` заменяя одну и ту же строку несколькими значениями?
  • Проблема с sed в массиве, содержащем строки, содержащие пробелы
  • замените с начала строки на 1 из нескольких шаблонов в конец другой строки со вторым шаблоном
  • Как анализировать файл данных для извлечения определенных данных и формата для другого использования?
  • Сопоставьте текущую строку до строки, которая не соответствует шаблону
  • сценарий оболочки для извлечения символов
  • Узнайте, на какой строке в текстовом файле соответствует слово
  • Объединение двух частей вместе для создания единого сценария
  • Как удалить все неупорядоченные строки из текстового файла?
  • Interesting Posts

    Доступ к Linux-серверу с компьютера Windows в графическом режиме через SSH

    Как создать скрипт для отправки электронной почты по telnet?

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

    различия между командами echo ">> и>

    Удалите повторяющиеся записи $ PATH с помощью команды awk

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

    Почему мое монтирование привязки видимо за пределами пространства имен mount?

    Имя хоста изменено удаленно через Wi-Fi?

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

    Сортировка и группирование доменов и поддоменов

    Меню не отображаются должным образом в последней версии Linux Mint

    Можно ли удаленно хранить логи для упругого поиска?

    kdm не может авторизовать моего пользователя?

    rsync: ошибка запуска протокола клиент-сервер

    iptables: использовать туннель ssh?

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