regex - 交替与 sed 中的预期不匹配

标签 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”开头,则将协议(protocol)捕获为组 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

最佳答案

也尝试逃避交替:

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

非常相关:Use of alternation in sed regex .

关于regex - 交替与 sed 中的预期不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6236905/

相关文章:

javascript - RexExp 传递变量

regex - 匹配字符串中超过 9 位数字的 9 位数字

regex - 使用 sed 查找模式包围的文本

linux - 删除第一个冒号和第一个制表符之间的所有内容

java - 来自缓存字符串的 Pattern.compile() 与缓存已编译模式

正则表达式(ruby)删除一组字符的所有实例,除非它们位于字符串的开头

Java:在 lambda 中分配一个变量

bash - tr -d 从字符串中删除精确的字符串

linux - 合并两个没有伪重复的文件

linux - 如何不使用正则表达式和 sed 检测结尾 '/'?