команда sed: '// D' - PullRequest
       23

команда sed: '// D'

0 голосов
/ 14 марта 2012

я пытаюсь понять

$ echo "reverse me" \ 
| sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
em esrever

( найдено здесь ). Но я не могу получить

//D

команда. При удалении //

/\n/!{
G
}
s/\(.\)\(.*\n\)/&\2\1/
D
s/.//

это не работает (кажется циклом).

Я ничего не нашел о // адресе на странице man или в разделе sed faq (где он иногда используется, но не объясняется).

Любая помощь будет оценена.

Ответы [ 4 ]

1 голос
/ 14 марта 2012

на этой странице: http://www.catonmat.net/blog/sed-one-liners-explained-part-one/

поиск по этой строке:

37. Reverse a line (emulates "rev" Unix command)
0 голосов
/ 15 марта 2012

Это может работать для вас:

echo reverse me | sed '/\n/!G;l;s/\(.\)\(.*\n\)/&\2\1/;l;//D;s/.//'
reverse me\n$
reverse me\neverse me\nr$
everse me\nr$
everse me\nverse me\ner$
verse me\ner$
verse me\nerse me\nver$
erse me\nver$
erse me\nrse me\never$
rse me\never$
rse me\nse me\nrever$
se me\nrever$
se me\ne me\nsrever$
e me\nsrever$
e me\n me\nesrever$
 me\nesrever$
me\nme\n esrever$
me\n esrever$
me\ne\nm esrever$
e\nm esrever$
e\n\nem esrever$
\nem esrever$
\nem esrever$
em esrever

Я добавил пару l команд до и после команды подстановки

Команда sed работает следующим образом:

  1. Только в первый раз, добавить новую строку в пробел /\n/!G
  2. Регулярное выражение группирует первый символ \(.\) (AKA \1), а затем все до первой новой строки \(.*\n\) (AKA \2), а затем заменяет эти две группы на полное совпадение &, а затем \2\1.
  3. Если предыдущее регулярное выражение истинно после подстановки //D удалить до первой новой строки, то есть удалить предыдущее выражение & и начать новый цикл, но не не читает новую строку. Эффективно зацикливается, пока не сработает регулярное выражение.
  4. Удалить первый символ, т. Е. Сработавший символ новой строки, который находится в начале строки s/.//
0 голосов
/ 14 марта 2012

Вы можете опустить содержимое шаблона в sed и указать его как //, что означает, что он будет обрабатываться так же, как и последнее использованное регулярное выражение. Удаляя его, вы переходите от удаления, когда шаблон соответствует всегда удалению.

0 голосов
/ 14 марта 2012

На странице руководства см .:

[2addr] D Удалите начальный сегмент пространства шаблона через первый символ новой строки и начните следующий цикл.

...