Ошибка с дополнительными символами в sed при использовании фигурных скобок или циклов - PullRequest
6 голосов
/ 23 ноября 2010

В настоящее время я пишу пакетный скрипт для чтения и изменения некоторых файлов конфигурации в Windows. К счастью, у меня есть доступ к сказанному, и поэтому я могу использовать это для большей части того, что мне нужно сделать, хотя и с некоторыми причудами из-за окружающей среды.

Выражение, которое я хотел бы выполнить:

sed '/\[$/{:loop N /^^]/!b loop} s/\n//g'

Который теоретически должен удалить любые новые строки на строках между строками в квадратных скобках. Я использую двойные каретки, чтобы убежать и использовать вторую (причуду cmd.exe). Однако это не удается из-за следующей ошибки:

sed: -e expression #1, char 15: extra characters after command

При тестировании некоторых других утверждений я получил следующие результаты.

sed '/\[/{ s/.*//g }' - Выполняется точно так, как должно

sed '/\[/{ N } s/.*//g' - Сбой с sed: -e expression #1, char 11: extra characters after command

sed 's/^^ */^&\n/ :loop s/.*/asdf/ b loop' - Сбой с sed: -e expression #1, char 12: unknown option to s'`

Я просто не уверен, связана ли моя ошибка с моим основным утверждением из-за неправильного синтаксиса или просто из-за того, что я в Windows. Любые мысли или помощь, которые вы можете предоставить, были бы замечательными.

1 Ответ

7 голосов
/ 23 ноября 2010

sed '/\[$/{:loop; N;/]$/!b loop}; s/\n//g'

Вам нужно ставить точки с запятой между вашими утверждениями.Кроме того, я использовал якорь '$' вместо '^', потому что вы никогда не совпадете с '/ ^] /', потому что ваша команда 'N' изменяет пространство шаблона, чтобы иметь вещи перед '['.Помните, что '/ /' совпадает с пробелом , а не с текущей строкой ввода.

Test

$ echo -e 'A\n[\nfoo\nbar\nbaz\n]\nB' | sed '/\[$/{:loop; N;/]$/!b loop}; s/\n//g'
A
[foobarbaz]
B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...