使用字符串替换取消基于正则表达式的配置行

时间:2013-12-17 20:18:32

标签: regex bash sed

我有一个配置文件,其中包含一堆已注释掉的repos的URL。我需要取消注释一个特定的一个,并认为sed可以很容易地匹配正则表达式,然后在该行上进行字符串替换。

我想知道我的正则表达式是否正确用于sed语法或sed命令是否正确?

mirrorRegex="^# http.*vendor.*distroARCH-1.1\/"
sed '/$mirrorRegex/s/# //' /etc/repos

在:

# ftp://mirrors.example.com/distro/distroARCH-1.1/
# http://mirrors.example.com/distro/distroARCH-1.1/
# ftp://packages.vendor.org/distro/distro/distroARCH-1.1/
# http://packages.vendor.org/distro/distro/distroARCH-1.1/
# http://mirror.school.edu/pub/distro/distroARCH-1.1/
# http://system.site3.com/distroARCH-1.1/

之后:期待的是什么。

# ftp://mirrors.example.com/distro/distroARCH-1.1/
# http://mirrors.example.com/distro/distroARCH-1.1/
# ftp://packages.vendor.org/distro/distro/distroARCH-1.1/
http://packages.vendor.org/distro/distro/distroARCH-1.1/
# http://mirror.school.edu/pub/distro/distroARCH-1.1/
# http://system.site3.com/distroARCH-1.1/

3 个答案:

答案 0 :(得分:4)

您需要使用双引号来扩展shell变量:

sed "/$mirrorRegex/s/# //"

答案 1 :(得分:1)

您可以像这样使用awk来做同样的事情:

awk '$0~var {sub(/^# /,x)}1' var="$mirrorRegex" file

答案 2 :(得分:0)

sed 's|^#[[:blank:]]*\(http.*vendor.*distroARCH-1.1/.*\)|\1|' YourFile

使用除默认/之外的其他分隔符(在这种情况下为|)将有所帮助

和变量版

Content='http.*vendor.*distroARCH-1.1/'
sed "s|^#[[:blank:]]*\(${Content}.*\)|\1|" YourFile