Я отправил этот вопрос на superuser немного назад, но я не получил ответа, который мне нравится. Вот он, слегка модифицированный.
Я надеялся, что sed сможет заменить всю строку заменой (а не просто соответствием), чтобы я мог сделать что-то вроде этого:
sed -e "/$some_complex_regex_with_a_backref/\1/"
и распечатайте только обратную ссылку.
Из этого вопроса кажется, что способ сделать это - возиться с регулярным выражением, чтобы соответствовать всей строке, или использовать какой-либо другой инструмент (например, 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 или других более сложных языков (sed, awk, grep и т. Д. В порядке)
- Решение не может удалить строки, которые не соответствуют исходному регулярному выражению (извините,
grep -o
не обрезает его).
То, о чем я думал, было следующее (но это уродливо, поэтому я хотел бы знать, есть ли что-то лучше):
$ sentinel=XXX
$ echo "$phrase" | sed "s/$regex/$sentinel\1$sentinel/" |
> sed "s/^.*$sentinel\(.*\)$sentinel.*$/\1/"