我有一个配置文件,其中包含一堆已注释掉的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/
答案 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