我正试图拉出来第三该行的子表达式:
#EXTRA_GROUPS="dialout cdrom floppy audio video plugdev users"
(是的,adduser.conf
对于那些好奇的人来说,该文件):
sed 's/\(EXTRA_GROUPS=\)\("\)\(.*\)\("\)/\3/' adduser.conf
虽然这确实有效并产生了
#dialout cdrom floppy audio video plugdev users
#
(我在表达式中省略了符号,所以请忽略),这个
sed 's/\(EXTRA_GROUPS=\)\("\)\(.*\)\("\)//3' adduser.conf
不会并保留文件原样。
我确实意识到最后一个示例应该删除后向引用号 3,但是当我使用/sd/3
(“将第三个子表达式替换为sd
”)修改命令时,它也没有真正执行任何操作。
我尝试使用 options-all 运行命令-n //p
以获得相同的结果。
sed
我在 Debian Jessie 机器上使用 GNU版本 4.2.2。
我是否错过了我的核心公用事业“教育”的某些关键部分,或者我是否已经有一段时间没有晒太阳了?
答案1
这/n
旗帜到替代命令s
与sed
没有任何关系反向引用 \n
。
- 例如,您可以将(当前行上)
s/regex/string/3
的第三个匹配项替换为。regex
string
- 使用
s/regex/\3/
,您可以将 的第一个匹配项替换regex
为第三个捕获组。 - 使用
s/regex/\3/3
,您可以将 的第三个匹配项替换regex
为第三个捕获组。
在这种情况下,我可能会选择更简单的东西,比如
sed 's/^.*EXTRA_GROUPS="\([^"]*\)".*$/\1/'
如果您不使用字符串,则捕获字符串的位是没有用的。