Sed заменить всю линию с заменой - PullRequest
0 голосов
/ 22 марта 2012

Я отправил этот вопрос на 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/"

1 Ответ

2 голосов
/ 23 марта 2012

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

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