我正在使用 Bash,可以\\+
使用grep
但不能使用sed
.
例如,如果我这样做
echo "abbbbc"| sed -e s/ab\\+c/def/
我得到这个结果:abbbbc
我尝试了 with '
或 with "
around s/ab\\+c/def/
,得到了相同的结果。
但如果我替换\\+
为*
,我得到:def
我必须改变>Atab_TR4682|c0_g1_i1|m.14206
成Atab
如果我做echo ">Atab_TR4682|c0_g1_i1|m.14206" | sed -e "s/>*\\([[:alpha:]]\\\*)_.\*/\1/g"
我得到Atab_TR4682|c0_g1
可能是因为*
也可以用于 0 迭代,但如果我替换*
为\\+
它根本不起作用..
有人有解释吗?
答案1
GNUsed
接受转义的+
,所以如果你sed
是 GNU 兼容的,你可以这样做:
$ echo "abbbbc" | sed 's/ab\+c/def'
def
$ echo "abbbbc" | sed "s/ab\+c/def"
def
$ echo "abbbbc" | sed s/ab\\+c/def
def
POSIX 指定的(更普遍可用的)sed
命令仅使用 POSIX BRE(基本的正则表达式)默认。如果您sed
是 POSIX 兼容但不兼容 GNU 并且您想x+
充当xx*
,那么您需要-E
切换:
$ echo "abbbbc" | sed -E 's/ab+c/def/'
def
一些非 GNU 实现sed
include-r
作为 的同义词-E
,以与旧版本的 GNU 兼容sed
。语法-E
是 POSIX,最近的 GNUsed
都接受这两种语法。