Изменить строку в sed?

echo 1234 | sed ' /\n/ !G s/\(.\)\(.*\n\)/&\2\1/ //D s/.// ' 

Я не могу понять вышеупомянутый код sed .

я понимаю:

 PATTERN SPACE=1234 first operation /\n/ !G ---> 1234\n(if \n is not found it is appended at th end) s/\(.\)\(.*\n\)/&\2\1/ ----> 1234\n234\n1 //D ----> \n234\n1(deletes upto newline and commands from the beginning are applied to the existing pattern space) PATTERN SPACE=\n234\n1 second operation /\n/ !G ---> skipped since \n234\n1 has newline now s/\(.\)\(.*\n\)/&\2\1/ ----> \n234\n1234\n //D ----> \n234\n1234\n 

Кажется, я делаю что-то неправильно.

One Solution collect form web for “Изменить строку в sed?”

В этом коде есть цикл, который становится запутанным. Этот бит:

  s/\(.\)\(.*\n\)/&\2\1/ //D 

Сохраняет цикл, перемещая символы 234\n1 до 34\n21 до 34\n21 пор, пока мы не останемся с \n4321 , где он выпадет из цикла.

Описание catonmat – это пятно, поэтому я включаю его здесь: 37. Переверните строку (эмулирует команду «rev» Unix). ,

выдержка

Первая строка "/\n/ !G" добавляет новую строку в конец пространства шаблонов, если ее не было.

Вторая строка "s/\(.\)\(.*\n\)/&\2\1/" – простое выражение s/// которое группирует первый символ как \1 и все остальные как \2 , Затем он заменяет всю согласованную строку символом "&\2\1" , где "&" – весь согласованный текст ( "\1\2" ). Например, если входная строка «1234», то после выражения s/// она становится "1234\n234\n1" .

Третья строка – "//D" . Это утверждение является ключевым в этом однострочном лайнере. Пустой шаблон // соответствует последнему существующему регулярному выражению, поэтому он точно такой же: /\(.\)\(.*\n\)/D . Команда «D» удаляет с начала ввода до первой новой строки, а затем возобновляет редактирование с помощью первой команды в скрипте. Он создает цикл. Пока /\(.\)\(.*\n\)/ , sed возобновит все предыдущие операции. После нескольких циклов текст в пространстве шаблонов становится "\n4321" . Тогда /\(. /\(.\)\(.*\n\)/

Четвертая строка "s/.//" удаляет первый символ в пространстве шаблонов, который является символом новой строки. Содержимое в пространстве шаблонов становится "4321" – реверсом "1234" .

Там у вас есть, линия была отменена.

  • Печать строки между шаблоном с помощью sed
  • Замена захваченной группы с помощью SED
  • sed - Как мне сопоставить этот шаблон?
  • sed для удаления 2 символов только в том случае, если это поле и пространство
  • смещение пробелов, совпадающее с путаницей
  • Сед работает с двумя линиями
  • проверить рекурсивный поиск sed и заменить перед запуском
  • Как я могу заставить команду sed выполнять постоянные изменения в файле?
  • sed extract с несколькими вариантами в конце рисунка
  • sed удалить все после строки?
  • Сделайте несколько изменений с помощью одного вызова sed
  • Linux и Unix - лучшая ОС в мире.