Использование разных разделителей в командах sed и диапазонах адресов - PullRequest
33 голосов
/ 03 мая 2011

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

  • /foo/bar

С:

  • /baz/qux

Однако команда sed s/// использует косую черту / в качестве ограничителя. Если я это сделаю, я увижу сообщение об ошибке, например:

▶ sed 's//foo/bar//baz/qux//' FILE
sed: 1: "s//foo/bar//baz/qux//": bad flag in substitute command: 'b'

Точно так же иногда я хочу выбрать линейные диапазоны, например линии между шаблоном foo/bar и baz/qux. Опять же, я не могу сделать это:

▶ sed '/foo/bar/,/baz/qux/d' FILE
sed: 1: "/foo/bar/,/baz/qux/d": undefined label 'ar/,/baz/qux/d'

Что я могу сделать?

1 Ответ

54 голосов
/ 03 мая 2011

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

sed '\,some/path,d'

И просто используйте его как есть для команды s:

sed 's,some/path,other/path,'

Вы, вероятно, хотите защитить другие метасимволы; Это хорошее место для использования Perl и quotemeta или их эквивалентов в других языках сценариев.

С man sed:

/<em>regexp</em>/
Совпадение строк, соответствующих регулярному выражению regexp.

\c<em>regexp</em>c
Совпадение строк, соответствующих регулярному выражению regexp. c может быть любым символом, кроме обратной косой черты или новой строки.

s/regular expression/replacement/flags
Подставьте строку замены для первого экземпляра регулярного выражения в пространстве шаблона. Любой символ, кроме обратной косой черты или новой строки, может использоваться вместо косой черты для разделения RE и замены. В RE и замене сам разделитель RE может использоваться в качестве литерального символа, если ему предшествует обратный слеш.

...