2012-03-22 6 views
0

Я отправил this question на суперпользователя немного назад, но я не получил ответа, который мне нравится. Здесь он слегка изменен.Sed заменить всю линию заменой

Я надеялся, что способ сделать СЭД заменить всю строку с заменой (а не просто матч), так что я мог бы сделать что-то вроде этого:

sed -e "/$some_complex_regex_with_a_backref/\1/" 

и он только распечатать назад- Справка.

От this question, похоже, способ сделать это беспорядок с регулярным выражением в соответствии со всей строкой или использовать какой-либо другой инструмент (например, perl). Простое изменение regex на .*regex.* не всегда работает (как упоминалось в этом вопросе). Например:

$ echo $regex 
\([:alpha:]*\)day 

$ echo "$phrase" 
it is Saturday tomorrow 
Warm outside... 

$ echo "$phrase" | sed "s/$regex/\1/" 
it is Satur tomorrow 
Warm outside... 

$ echo "$phrase" | sed "s/.*$regex.*/\1/" 

Warm outside... 

$ # what I'd like to have happen 
$ echo "$phrase" | [[[some command or string of commands]]] 
Satur 
Warm outside... 

Я ищу самый краткий способ заменить всю строку (а не только соответствие части) предполагая следующее:

  • регулярное выражение в переменной, поэтому может не меняются в каждом конкретном случае.
  • Я хотел бы сделать это без использования Perl или других beefier языков (SED, AWK, Grep, и т.д. все в порядке)
  • Решение не может удалить строки, которые не соответствуют оригинальному регулярному выражению (извините grep -o не разрезает его).

То, что я думал был следующий (но это некрасиво, поэтому я хотел бы знать, если есть что-то лучше):

$ sentinel=XXX 
$ echo "$phrase" | sed "s/$regex/$sentinel\1$sentinel/" | 
> sed "s/^.*$sentinel\(.*\)$sentinel.*$/\1/" 

ответ

2

Это может работать для вас:

sed '/'"$regex"'/!b;s//\n\1\n/;s/.*\n\(.*\)\n.*/\1/' file 
+0

Это работает! Постарайтесь кратко объяснить, как это делается? – jakesandlund

+0

Где вы видите '\ n' read * sentinel *. Поскольку sed использует '\ n' в качестве разделителя строк,' \ n' не может отображаться в пространстве шаблонов, если он не вставлен пользователем. Следовательно, это идеальный * дозорный *. – potong