Я отправил 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/"
Это работает! Постарайтесь кратко объяснить, как это делается? – jakesandlund
Где вы видите '\ n' read * sentinel *. Поскольку sed использует '\ n' в качестве разделителя строк,' \ n' не может отображаться в пространстве шаблонов, если он не вставлен пользователем. Следовательно, это идеальный * дозорный *. – potong