Проблема с Sed regex на Mac, отлично работает на Linux - PullRequest
13 голосов
/ 20 июля 2011

Это отлично работает в Linux (Debian):

sed -e 's,^[ \t]*psd\(.*\)\;,,' 

В Mac я считаю, что мне нужно использовать флаг -E вместо -e:

sed -E 's,^[ \t]*psd\(.*\)\;,,'

но регулярное выражение не соответствует, и, следовательно, не удаляет строки, которые я хочу.

Любые советы о том, как решить эту проблему?

Пример ввода:

apa
bepa
    psd(cepa);
depa psd(epa);
  psd(fepa gepa hepa);

Для этого входа ожидаемый результат:

apa
bepa
depa psd(epa);

Ответы [ 5 ]

12 голосов
/ 20 июля 2011

Флаг -E означает использование расширенных регулярных выражений. Вы должны просто использовать -e, как в Linux. sed в Mac OS X основан на BSD sed, поэтому не имеет расширений GNU.

После копирования образца ввода:

[~ 507] pbpaste | sed -e 's,^[[:space:]]*psd\(.*\);,,'
apa
bepa

depa psd(epa);
8 голосов
/ 20 июля 2011

'\t' не является стандартным в 'sed', это расширение GNU.

Чтобы соответствовать 'tab', вам нужно ввести в ваш скрипт реальный 'tab'. Это легко в файле, сложнее в оболочке.

Та же проблема может возникнуть в AIX, Solaris и HP-UX или других UNIX.

6 голосов
/ 16 июля 2012

В качестве альтернативы вы можете использовать GNU-версию sed вместо реализации, предоставляемой Mac OSX.

Порт Mac предоставляет для него порт sudo port install gsed.После установки вы можете использовать gsed вместо sed.

4 голосов
/ 23 октября 2014

В дополнение к ответам выше, вы можете использовать полезную (но зависящую от оболочки) уловку. В bash используйте $'\t', чтобы ввести буквенный символ табуляции. Следующие работы на моем Mac:

sed -e 's,^[ '$'\t''*psd\(.*\);,,'

Обратите внимание, что теперь все выражение sed состоит из трех объединенных строк.

Этот трюк может быть полезен в случае, если вам нужен символ табуляции, без совпадения с другими пробелами (то есть, когда [[:blank:]] будет слишком инклюзивным). Для вышесказанного флаг -e не обязателен.

2 голосов
/ 20 июля 2011

Я проверил этот пример ввода на моей машине и столкнулся с проблемой, когда в третьей строке был символ табуляции в начале строки и регулярное выражение ^[ \t]*psd\(.*\)\; не совпадало с ним.Это может быть передано классом символов sed [[:blank:]], который равен комбинации пробела и символа табуляции.Таким образом, вы можете попробовать следующее:

sed -E 's,^[[:blank:]]*psd\(.*\)\;,,' demo.txt

это приведет к следующему выводу:

apa
bepa

depa psd(epa);

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

sed -n '/^[[:blank:]]*psd\(.*\)\;/!p' demo.txt

результат:

apa
bepa
depa psd(epa);

это просто обратный вывод соответствующего шаблона (!p).

РЕДАКТИРОВАНИЕ: Чтобы сопоставить символы табуляции в регулярном выражении в sed (macosx), вы также можете попробовать рекомендацию из Как мне вставить символ табуляции с sed в OS X?

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