如何用 sed 替换一行的一部分?
线路
DBSERVERNAME xxx
应替换为:
DBSERVERNAME yyy
值 xxx 可能会有所不同,并且 dbservername 和该值之间有两个选项卡。该名称-值对是配置文件中的众多名称-值对之一。
我尝试使用以下反向引用:
echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
这导致了一个错误:“s”命令的 RHS 上的引用 \1 无效。
表情有什么问题吗?使用 GNU sed。
这有效:
sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip'
(当您使用 -r 选项时,不必转义括号。)
一点解释:
-
-r
是扩展的正则表达式 - 改变了正则表达式的编写方式。
-
-n
除非指定,否则不打印 -sed
否则默认打印,
-
-e
means what follows it is an expression. Let's break the expression down:
-
s///
是搜索替换的命令,第一对之间是要匹配的正则表达式,第二对是替换,
-
gip
,它跟随搜索替换命令;g
表示全局,即,每行匹配项而不仅仅是第一个匹配项将被替换为一行;i
不区分大小写;p
表示完成后打印(记住-n
之前的旗帜!),
- 括号代表匹配部分,稍后会提到。所以
dbservername
是第一个匹配部分,
-
\s
是空白,+
表示一个或多个(相对于*
,零个或多个)出现,
-
\w
是一个单词,可以是任何字母、数字或下划线,
-
\1
是 GNU 的特殊表达sed
打印随附搜索中第一个括号内的匹配项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)