在正则表达式中打印反向引用

jak*_*und 6 shell grep awk sed

我希望有一种方法让 sed 用替换(而不仅仅是匹配)替换整行,这样我就可以做这样的事情:

sed -e "/$some_complex_regex_with_a_backref/\1/"
Run Code Online (Sandbox Code Playgroud)

并让它只打印反向引用。

这个问题来看,似乎这样做的方法是使用正则表达式来匹配整行,或者使用其他工具(如 perl)。简单地更改regexto.*regex.*并不总是有效(如该问题中所述)。例如:

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

$ echo $phrase
it is Saturday tomorrow

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

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

$ # what I'd like to have happen
$ echo $phrase | [[[some command or string of commands]]]
Satur
Run Code Online (Sandbox Code Playgroud)

假设以下情况,我正在寻找最简洁的方法来做到这一点:

  • 正则表达式在一个变量中,因此不能根据具体情况进行更改。
  • 我想在不使用 perl 或其他更强大的语言的情况下做到这一点。

jak*_*und 0

我也在SO上问了这个问题,并从 potong 得到了这个答案,它满足了我的要求。

sed '/'"$regex"'/!b;s//\n\1\n/;s/.*\n\(.*\)\n.*/\1/' file
Run Code Online (Sandbox Code Playgroud)

请注意,它并不依赖于对$regex工作内容的了解。它使用换行符作为哨兵值,以便稍后仅用反向引用替换整行。