Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 sed需要正则表达式吗_Regex_Sed - Fatal编程技术网

Regex sed需要正则表达式吗

Regex sed需要正则表达式吗,regex,sed,Regex,Sed,我正在尝试创建一个脚本,该脚本将在sources.list(Ubuntu)中启用amnog其他东西来启用源代码存储库。您可能知道,也可能不知道存储库文件的格式如下: deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted # deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted # etc. 因此,我希望启用源代码存储库(

我正在尝试创建一个脚本,该脚本将在sources.list(Ubuntu)中启用amnog其他东西来启用源代码存储库。您可能知道,也可能不知道存储库文件的格式如下:

deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# etc.
因此,我希望启用源代码存储库(使用deb src取消注释行),但只启用前面带有未注释deb行的源代码存储库。这应该是完美的,但我不能使这项工作。 这就是我现在拥有的:

sed-i的/^#deb src/deb src/gm'/etc/apt/sources.list
我想要的是这样的东西,但它应该只替换注释行,而不是所有内容:

sed-i's/^deb.*$^#deb src/deb src/gm'/etc/apt/sources.list

那么,有没有一种方法可以使sed的regex只替换匹配字符串的一部分呢?

我个人更喜欢
awk/perl
来匹配两个连续的行

awk '/^# *deb-src/ && p ~ /^deb /{sub(/^# */, "")} {p=$0} 1'
  • p=$0
    保存上一行
  • /^#*deb src/&p~/^deb/
    如果当前行以注释开头,且具有deb src且前一行以deb开头
  • sub(/^#*/,“”)
    删除注释
  • 1
    打印当前记录的惯用方法,包括所做的任何更改
  • 另见:

使用
sed
,您可能需要

sed '/^deb /{n; /^# *deb-src/ s/# *//p; D}'


但我不确定这是否能处理所有的案件。有关详细信息,请参阅。只有在图案空间中有多行时,
m
修饰符才会起作用。默认情况下,
sed
使用换行符作为行分隔符,并且在模式空间中只有一行。手动链接有更多细节

我个人更喜欢
awk/perl
来匹配两个连续的行

awk '/^# *deb-src/ && p ~ /^deb /{sub(/^# */, "")} {p=$0} 1'
  • p=$0
    保存上一行
  • /^#*deb src/&p~/^deb/
    如果当前行以注释开头,且具有deb src且前一行以deb开头
  • sub(/^#*/,“”)
    删除注释
  • 1
    打印当前记录的惯用方法,包括所做的任何更改
  • 另见:

使用
sed
,您可能需要

sed '/^deb /{n; /^# *deb-src/ s/# *//p; D}'


但我不确定这是否能处理所有的案件。有关详细信息,请参阅。只有在图案空间中有多行时,
m
修饰符才会起作用。默认情况下,
sed
使用换行符作为行分隔符,并且在模式空间中只有一行。如果您的sources.list仅由以下行组成,则手动链接包含更多详细信息:

deb http://................
deb-src http://............

# deb http://...........
# deb-src http://.........

deb http://................
# deb-src http://............
您不需要删除注释行,只需修改以
deb
开头的未注释行之后的行,即可创建一个新的sources.list文件:

grep -A1 "^deb " sources.list | sed "s/# deb-src/deb-src/g"
这样,您只需grep以
^deb
开头的行和下面的行,然后取消注释下一行(以
#deb src
开头的行)

然后,您可以将输出发送到一个新文件,该文件可以由sources重命名。之后,请列出:

grep -A1 "^deb " sources.list | sed "s/# deb-src/deb-src/g" > sources_new && mv -f sources_new sources.list

但是,只有在sources.list文件中有这种确切的语法时,这才有效。

如果sources.list仅由以下行组成:

deb http://................
deb-src http://............

# deb http://...........
# deb-src http://.........

deb http://................
# deb-src http://............
您不需要删除注释行,只需修改以
deb
开头的未注释行之后的行,即可创建一个新的sources.list文件:

grep -A1 "^deb " sources.list | sed "s/# deb-src/deb-src/g"
这样,您只需grep以
^deb
开头的行和下面的行,然后取消注释下一行(以
#deb src
开头的行)

然后,您可以将输出发送到一个新文件,该文件可以由sources重命名。之后,请列出:

grep -A1 "^deb " sources.list | sed "s/# deb-src/deb-src/g" > sources_new && mv -f sources_new sources.list

但是,只有在sources.list文件中有这个确切的语法时,这才有效。

除了使用
-r
之外,还要使用
-z

sed -rz -i 's/^(deb .*\s+)^# deb-src/\1deb-src/gm' /etc/apt/sources.list

捕获组是必要的,以便在替换时引用它们。

除了使用
-r
,还使用
-z

sed -rz -i 's/^(deb .*\s+)^# deb-src/\1deb-src/gm' /etc/apt/sources.list

捕获组是必要的,以便在替换时引用它们。

在默认源列表中,有几个条目对deb和deb src行都进行了注释。在这种情况下,我希望他们保持评论。啊,现在我明白了。我的错。你看了吗?我不认为这与我的问题有关。我不明白你的问题是什么。它不工作吗?在default sources.list中有几个条目,其中对deb和deb src行都进行了注释。在这种情况下,我希望他们保持评论。啊,现在我明白了。我的错。你看了吗?我不认为这与我的问题有关。我不明白你的问题是什么。这不管用吗?就是这样:)谢谢这是:)谢谢你的详细回复,但我更喜欢user@revo提供的答案。谢谢你的详细回复,但我更喜欢user@revo提供的答案。