在sed中预期的交替不匹配

时间:2011-06-04 13:08:16

标签: regex sed

学习sed,我想将以下输入行的驱动器号从“a”更改为“d”:

http:/a/foo/bar.txt
http:/a/bar/foo.txt
file:/a/foobar.txt
http:/b/foo/bar.txt
http:/c/foobar.txt

我正在使用以下sed表达式:

sed 's_^\(http|file\):/a_\1:/d_' in.txt

即:如果一行以“http”或“file”开头,则以“:/ a”开头,将协议捕获为组1,并将“a”替换为“d”。或者至少它应该是。

然而,我似乎无法获得交替运算符'|'上班。如果我只为组使用'http'或'file',那么命令就会按预期运行,如果我对组使用'http | file',那么这些行都不匹配:

mbook:sed rob$ sed 's_^\(http\):/a_\1:/d_' in.txt
http:/d/foo/bar.txt
http:/d/bar/foo.txt
file:/a/foobar.txt
http:/b/foo/bar.txt
http:/c/foobar.txt
mbook:sed rob$ sed 's_^\(file\):/a_\1:/d_' in.txt
http:/a/foo/bar.txt
http:/a/bar/foo.txt
file:/d/foobar.txt
http:/b/foo/bar.txt
http:/c/foobar.txt
mbook:sed rob$ sed 's_^\(http|file\):/a_\1:/d_' in.txt
http:/a/foo/bar.txt
http:/a/bar/foo.txt
file:/a/foobar.txt
http:/b/foo/bar.txt
http:/c/foobar.txt

2 个答案:

答案 0 :(得分:4)

尝试逃避交替:

sed 's_^\(http\|file\):/a_\1:/d_' in.txt

非常相关:Use of alternation in sed regex

答案 1 :(得分:2)

转义|或使用扩展正则表达式

sed -r 's_^(http|file):/a_\1:/d_'