如何用sed替换一部分线?
这条线
DBSERVERNAME xxx
Run Code Online (Sandbox Code Playgroud)
应该替换为:
DBSERVERNAME yyy
Run Code Online (Sandbox Code Playgroud)
值xxx可以变化,dbservername和值之间有两个选项卡.此名称 - 值对是配置文件中的众多名称 - 值对之一.
我尝试了以下反向引用:
echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip'
Run Code Online (Sandbox Code Playgroud)
这导致了一个错误:`s'命令的RHS上的引用\ 1无效.
这个表达方式有什么问题?使用GNU sed.
Jer*_*ein 48
这有效:
sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip'
Run Code Online (Sandbox Code Playgroud)
(当您使用-r选项时,您不必逃避parens.)
一点解释:
-r
是扩展的正则表达式 - 对正则表达式的编写方式有所不同.-n
除非指定sed
,否则不打印 - 否则默认打印,-e
意味着它是一个表达式.让我们打破表达式:
s///
是搜索替换的命令,第一对之间的匹配是匹配的正则表达式,第二对是替换,gip
,跟随搜索替换命令; g
意味着全局,即每个匹配而不仅仅是第一个匹配将被替换为一行; i
不区分大小写; p
表示完成时打印(记住之前的-n
标志!),dbservername
是第一场比赛的一部分,\s
是空格,+
表示一个或多个(vs *
,零或更多)出现,\w
是一个单词,即任何字母,数字或下划线,\1
是GNU的一个特殊表达式,sed
它在随附的搜索中打印出第一个括号内的匹配.其他人已经提到了括号的转义,但是如果线的第一部分是常数,为什么你需要一个后向引用呢?
你可以干脆做
sed -e 's/dbservername.*$/dbservername yyy/g'
Run Code Online (Sandbox Code Playgroud)