Вы можете использовать perl one-liners так же, как и с sed, с преимуществом полной поддержки регулярного выражения perl (что намного мощнее, чем то, что вы получаете с sed). На * nix платформах также очень мало изменений - perl обычно perl. Так что вы можете перестать беспокоиться о том, как заставить версию вашей конкретной системы sed делать то, что вы хотите.
В этом случае вы можете сделать
perl -pe 's/(regex)/\n$1/'
-pe
помещает perl в цикл «выполнить и напечатать», очень похожий на обычный режим работы sed.
'
цитирует все остальное, чтобы оболочка не мешала
()
, окружающее регулярное выражение, является оператором группировки. $1
справа от замены выводит все, что было найдено в этих скобках.
Наконец, \n
- это новая строка.
Независимо от того, используете ли вы скобки в качестве оператора группировки, вы должны избегать любых скобок, которые вы пытаетесь сопоставить. Так что регулярное выражение в соответствии с шаблоном, который вы перечислили выше, будет выглядеть примерно так:
\(\d\d\d\)\d\d\d-\d\d\d\d
\(
или \)
соответствует буквальному пареню, а \d
соответствует цифре.
Лучше:
\(\d{3}\)\d{3}-\d{4}
Я полагаю, вы можете понять, что делают числа в фигурных скобках.
Кроме того, вы можете использовать разделители, отличные от / для вашего регулярного выражения. Так что если вам нужно соответствовать / вам не нужно избегать его. Любое из приведенного ниже эквивалентно регулярному выражению в начале моего ответа. Теоретически вы можете заменить любой символ на стандартные /.
perl -pe 's#(regex)#\n$1#'
perl -pe 's{(regex)}{\n$1}'
Дополнительный совет - если у вас установлен пакет pcre, он поставляется с pcregrep
, в котором используются полностью совместимые с perl регулярные выражения.