regex - sed 需要正则表达式

标签 regex sed

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

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 行的代码。 GNU sed应该是完美的,但我无法完成这项工作。 这就是我现在所拥有的:

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

我想要的是这样的东西,但它应该只替换注释行而不是所有内容:

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

那么有没有一种方法可以使 sed 的正则表达式仅替换匹配字符串的一部分?

最佳答案

除了 -r 之外,还使用 ​​-z:

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

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

关于regex - sed 需要正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925812/

相关文章:

python - 如何使用 Python NLTK 仅打印出 Wo​​rdNet 同义词集中的单词本身?

regex - 在 Shell 中使用 SED 查找和替换 HTML 标签

regex - htaccess 删除 .php、.html 和尾部斜杠

javascript - 用 span 包裹字符串

regex - R strsplit : Split based on character except when a specific character follows

linux - 从一个文件复制内容并需要使用 sed 替换到另一个文件中

linux - SED 替换括号内的单词

bash - 根据文件中的十六进制对一些模式匹配行进行排序

linux - 使用 sed 打印以两种不同模式开头的行

javascript - 反斜杠 - 正则表达式 - Javascript