Подтвердить что ты не робот

Как вы "отлаживаете" регулярное выражение с помощью sed?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Моя версия 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, поскольку я склонен использовать его больше для quick'n'dirty jobs: -)

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

Ответ 2

В 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

Ответ 3

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

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

sedsed example

Другой отладчик sed, sd от Brian Hiles, написанный как оболочка Bourne script (я не использовал этот).

Ответ 4

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

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

или вам нужно избежать символов {}:

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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