2016-12-16 2 views
2

Можно ли с sed заменить строку группами захвата из регулярного выражения?sed заменить строку на группы захвата

У меня есть это регулярное выражение, обратите внимание, что это исправлено, я не могу его изменить.

simple sample(.*)

Это то, что я хочу:

This is just a simple sample line with some text 

Изменить на:

line with some text 

мне нужно что-то вроде этого:

sed '/simple sample \(.*\)/c \1' 

который теперь выдает :

1 

Кто-нибудь знает, можете ли вы использовать группы захвата в sed с помощью функции линии изменения?

+1

У вас его почти нет, вам просто нужен синтаксис 'sed '/ find/replace /': 'sed' s \ (. * \) Простой пример \ (. * \) С \ (. * \)/\ 1 \ 2/'файл'. Я не знаю, почему вы используете '\ c'. – fedorqui

+0

Да, я знаю, что это возможно для этого примера, спасибо. Но проблема в том, что мне нужно заменить строку, потому что у меня есть регулярные выражения, которые мне нужно обработать, когда они соответствуют строке, у меня есть только доступное значение замены. То есть. У меня может быть простой образец регулярного выражения, который, если он соответствует, должен изменить строку на 'great'. Когда я использую метод, я бы получил «Это просто отличная строка с текстом». Я знаю, что это можно было бы решить, когда правильные регулярные выражения будут введены на место (в данном случае '(. *) Простой пример (. *)', Но это невозможно из-за того, что у меня есть./c'. – zjeraar

+1

Да, вы правы, я изменил его. – zjeraar

ответ

2

Нравится?

echo "This is just a simple sample line with some text" | \ 
    sed 's/simple sample \(.*\)/\n\1/;s/.*\n//' 

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

+0

Да :-). Не могли бы вы немного объяснить, что происходит в последнем разделе? – zjeraar

+0

А я понимаю. Замечательно, не знал о. Для людей, находивших это, часть перед; ставит то, что нам нужно, на новую строку и часть после; удаляет первую строку. – zjeraar

0

Перл на помощь!

perl -ne 'if (/(.*)simple sample (.*) with (.*)/) { 
      print "$1$2\n"; 
      } else { print }' 
+0

Да, это работает, но мне действительно нужно sed здесь, кроме случаев, когда это невозможно. – zjeraar

Смежные вопросы