2

Я применяю sed 's/^ bug*/__/' к

  ref      bug
  bug      ref

и получить

  ref     __
 __      ref

То же самое относится к perl, perl -ni -e 's/^ bug/__/; print' . Образец файла можно скачать здесь . Sed и perl - это утилиты cygwin, которые я запускаю из командной строки Windows. Когда я запускаю их через Cygwin Bash, этого не происходит.

3 ответа3

4

В этом случае проблема связана с "причудами" cmd.exe (из-за отсутствия лучшего слова) с обработкой не алфавитно-цифровых символов в одинарных кавычках. По сути, символы каретки и пробела игнорируются.

Самый простой способ избежать этой проблемы (если запуск ее в надлежащей оболочке Cygwin bash нежелателен) - вместо этого использовать двойные кавычки ...

C:\cygwin\home\costa\wk>sed 's/^  bug*/__/' sed.txt
  ref    __
__      ref

C:\cygwin\home\costa\wk>sed "s/^  bug*/__/" sed.txt
  ref      bug
__      ref
0

Прежде всего, используйте это вместо:

sed 's/^ *bug-+/__/' input

Таким образом, он будет работать с несколькими пробелами до bug и одной или несколькими чертами после нее. Это только незначительная деталь, хотя. Отправленная вами команда отлично работает на моем Debian.

Не могли бы вы опубликовать фактический файл, который вы пытаетесь изменить где-то? Я предполагаю, что у вас есть оконные линии или окончания в стиле Mac, и это может запутать sed. Если я прав, это должно помочь:

perl -pi -e 's/\r\n|\n|\r/\n/g' input

Затем снова запустите ту же команду sed для файла.

Если это не сработает, возможно, что-то особенное в sed cygwin. Вместо этого попробуйте эту команду Perl (после того, как убедитесь, что символ конца строки равен \n командой выше):

perl -ne 's/^\s*bug-+/__/; print'
0

(Это должен быть комментарий, но у меня недостаточно репутации, чтобы добавить комментарий ...)

Вы только что поджарили мой мозг. В моем Cygwin происходит то же самое. Я был потрясен. Кажется, это ошибка в том, как обрабатываются подстановочные знаки, используют ли они синтаксис регулярного выражения или стиль glob (стиль glob - это где * означает «любое число любого типа символа», регулярное выражение * означает «0 или больше предыдущих персонажей ».

Итак, я попробовал это в моей оболочке QNX. Это работает, если я не пытаюсь использовать плюс перед ошибкой, как в "s/^ +bug -/__/". Я могу заменить * вместо +, и это работает. Я думаю, что некоторые реализации sed испытывают трудности с выбором регулярного выражения или синтаксиса glob, и в результате возникает непредсказуемый беспорядок.

Я не пробовал Perl (пока не установил его на этой новой машине), но я был бы вдвойне шокирован, если бы Perl справился с ним так плохо.

Чтобы ответить на ваш вопрос, насколько мне известно и ~ 100 000 моих ближайших друзей в Google, вы точно понимаете, как должен работать оператор ^.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .