Как вы "отлаживаете" регулярное выражение с помощью sed? - PullRequest
31 голосов
/ 29 октября 2010

Я пытаюсь использовать регулярное выражение, используя sed. Я протестировал свое регулярное выражение с kiki, приложением gnome для тестирования регулярного выражения, и оно работает в kiki.

date: 2010-10-29 14:46:33 -0200;  author: 00000000000;  state: Exp;  lines: +5 -2;  commitid: bvEcb00aPyqal6Uu;

Я хочу заменить author: 00000000000; ничем. Итак, я создал регулярное выражение, которое работает, когда я тестирую его в kiki:

author:\s[0-9]{11};

Но не работает, когда я проверяю его в sed.

sed -i "s/author:\s[0-9]{11};//g" /tmp/test_regex.txt

Я знаю, что регулярные выражения имеют разные реализации, и это может быть проблемой. Мой вопрос: как мне, по крайней мере, попытаться «отладить» то, что происходит с sed? Почему не работает?

Ответы [ 8 ]

21 голосов
/ 29 октября 2010

В Sed вам нужно избежать фигурных скобок. "s/author:\s[0-9]\{11\};//g" должно работать.

Sed не имеет возможности отладки. Для тестирования вы упрощаете в командной строке итеративно, пока не получите что-то для работы, а затем соберите обратно.

ввод командной строки:

$ echo 'xx a: 00123 b: 5432' | sed -e 's/a:\s[0-9]\{5\}//'

вывод командной строки:

xx  b: 5432
21 голосов
/ 29 октября 2010

Моя версия sed не любит бит {11}. Обработка строки с:

sed 's/author: [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9];//g'

отлично работает.

И способ отладки это именно то, что я сделал здесь. Я только что построил команду:

echo 'X author: 00000000000; X' | sed ...

и убрал более продвинутые регулярные выражения по одному:

  • использовал <space> вместо \s, не исправил.
  • заменил [0-9]{11} на 11 копий [0-9], что сработало.

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

Но, на самом деле, это будет на самом деле работать без отвратительных 11 копий [0-9], вам просто нужно убрать скобки [0-9]\{11\}. Я должен признать, что я не удосужился попробовать это, так как это работало хорошо с мультипликаторами, и я вообще не слишком беспокоюсь о краткости в sed, так как я склонен использовать это больше для быстрых и грязных работ : -)

Но метод скобок - это гораздо более лаконичный и адаптируемый, и полезно знать, как это сделать.

16 голосов
/ 29 октября 2010

Существует сценарий Python под названием sedsed от Aurelio Jargas, который покажет пошаговое выполнение сценария sed. Подобный отладчик не очень поможет в случае буквального восприятия символов (например, {) по сравнению со специальным значением (например, \{), особенно для простой замены, но это поможет, когда более сложный скрипт отлаживается.

Последняя версия SVN .
Самый последний стабильный выпуск .
Отказ от ответственности: я незначительный вклад в sedsed.

sedsed example

Другой sed отладчик, sd, написанный Брайаном Хайлсом, написанный как сценарий оболочки Bourne (я не использовал его).

12 голосов
/ 07 сентября 2013

Вы должны использовать флаг -r для расширенного регулярного выражения:

sed -r 's/author:\s[0-9]{11};//g'

или экранировать символы {}:

sed 's/author:\s[0-9]\{11\};//g'
2 голосов
/ 29 октября 2010

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

perl -pi.orig -e 's/author:\s[0-9]{11};//g' file1 file2 file3

По крайней мере, таким способом вы всегда можете добавить -Mre=debug для отладки регулярного выражения.

2 голосов
/ 29 октября 2010

Вы используете флаг -i неправильно.Вам нужно поставить дать ему строку для временного файла.Вам также необходимо убрать свои фигурные скобки.

sed -ibak -e "s/author:\s[0-9]\{11\};//g" /tmp/test_regex.txt

Обычно я отлаживаю свое утверждение, начиная с регулярного выражения, которое, я знаю, будет работать (например, 's / author // g' в этом случае).Когда это работает, я знаю, что у меня есть правильные аргументы.Затем я постепенно расширяю регулярное выражение.

1 голос
/ 23 июня 2018

Если вы хотите отладить команду sed, вы можете использовать команду w (запись), чтобы вывести, какие строки sed соответствуют файлу.

Из sed manpages:

Команды, которые принимают диапазоны адресов

(...)

w имя файла

Записать текущее пространство шаблона вимя файла.


Применение к вашему вопросу

Давайте используем файл с именем sed_dump.txt в качестве файла дампа sed.

1) Создать дамп sed:

sed "/author:\s[0-9]{11};/w sed_dump.txt" /tmp/test_regex.txt

2) Проверить файл sed_dump.txt содержимое:

cat sed_dump.txt

Вывод:

Пусто ...

3) Попытка экранировать '{' управляющий символ регулярного выражения:

sed "/author:\s[0-9]\{11\};/w sed_dump.txt" /tmp/test_regex.txt

4) Проверить файл sed_dump.txt содержимое:

cat sed_dump.txt

Вывод:

дата: 2010-10-29 14:46:33 -0200;автор: 00000000000;состояние: Exp;линии: +5 -2;commitid: bvEcb00aPyqal6Uu;

Заключение

На шаге 4) строка была сопоставлена, это означает, что sed соответствует вашему шаблону в этой строке.Это не гарантирует правильного ответа, но это способ отладки с использованием sed.

0 голосов
/ 29 октября 2010

Тот факт, что вы подставили author: 00000000000, уже упоминается в sed, когда вы добавляете s перед первым /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...