команда 'd' в утилите sed - PullRequest
5 голосов
/ 22 ноября 2011

Из документации sed:

d      Delete the pattern space; immediately start next cycle.

Что означает следующий цикл ?Насколько я понимаю, sed не будет применять следующие команды после команды d и начинает читать следующую строку из входного потока и обрабатывает ее.Но, похоже, это не так.См. Этот пример:

[root@localhost ~]# cat -A test.txt
aaaaaaaaaaaaaa$
$
bbbbbbbbbbbbb$
$
$
ccccccccc$
ddd$
$
eeeeeee$
[root@localhost ~]# cat test.txt | sed '/^$/d;p;p'
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
bbbbbbbbbbbbb
bbbbbbbbbbbbb
bbbbbbbbbbbbb
ccccccccc
ccccccccc
ccccccccc
ddd
ddd
ddd
eeeeeee
eeeeeee
eeeeeee
[root@localhost ~]# 

Если немедленно запустить следующий цикл , команда p не будет иметь никакихвыход.

Кто-нибудь может помочь мне объяснить это, пожалуйста?Спасибо.

Ответы [ 2 ]

8 голосов
/ 22 ноября 2011

Это означает, что sed прочитает следующую строку и начнет ее обрабатывать.

Ваш тестовый скрипт не делает то, что вы думаете.Он сопоставляет пустые строки и применяет к ним команду удаления.Они не появляются, поэтому операторы print не применяются к пустым строкам.Две команды печати не связаны с шаблоном для команды удаления, поэтому непустые строки печатаются три раза.Если вместо этого вы попробуете

sed '/./d;p;p' test.txt # matches all non-empty lines

, ничего не будет напечатано, кроме пустых строк, три раза каждая.

1 голос
/ 22 ноября 2011

а) Вы можете объединить несколько команд для одного шаблона с помощью фигурных скобок:

sed '/^$/{d;p;p}' test.txt

aaaaaaaaaaaaaa
bbbbbbbbbbbbb
ccccccccc
ddd
eeeeeee

Команда d применяется только к пустым строкам: '/ ^ $ / d; p; p'. В противном случае строка печатается 2 раза. Чтобы связать команду «p» с шаблоном, вы должны создать фигурные скобки. Тогда команда p также пропускается, но из-за пропуска следующего цикла, а не потому, что она не совпадает.

б) Бесполезное использование кошки. (уже показано)

...