Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用字符串替换取消基于正则表达式的配置行的注释_Regex_Bash_Sed - Fatal编程技术网

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

Regex 使用字符串替换取消基于正则表达式的配置行的注释,regex,bash,sed,Regex,Bash,Sed,我有一个配置文件,其中包含一堆被注释掉的repo URL。我需要取消注释一个特定的正则表达式,并认为sed将使匹配正则表达式变得容易,然后在该行上进行字符串替换 我想知道我的正则表达式对于sed语法是否正确,或者sed命令是否不正确 mirrorRegex="^# http.*vendor.*distroARCH-1.1\/" sed '/$mirrorRegex/s/# //' /etc/repos 之前: # ftp://mirrors.example.com/distro/distroA

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

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

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

您可以像这样使用
awk
执行相同的操作:

awk '$0~var {sub(/^# /,x)}1' var="$mirrorRegex" file
使用默认分隔符以外的其他分隔符(在本例中为
|
)将有所帮助

和可变版本

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

这不是你所期望的吗?@UriMikhli第二部分是我所期望的,但它不起作用。anubhava指出,在运行sed时,我使用的是单引号,它没有扩展shell变量。哇,我不知道为什么我不记得了。谢谢你,我不觉得自己很愚蠢。我会尽快接受这个答案。非常感谢你给我看。我想awk也能用,我正在努力学习sed和awk。
Content='http.*vendor.*distroARCH-1.1/'
sed "s|^#[[:blank:]]*\(${Content}.*\)|\1|" YourFile