sed:替换部分行

cal*_*shy 38 sed

如何用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它在随附的搜索中打印出第一个括号内的匹配.

  • 我知道你们在shell命令方面有很多经验......但请尽可能关心有抱负的Linux菜鸟......里面的所有东西都需要解释......或者我必须经历整个[ DOC](https://www.gnu.org/software/sed/manual/sed.html) (7认同)

Vic*_*cky 9

其他人已经提到了括号的转义,但是如果线的第一部分是常数,为什么你需要一个后向引用呢?

你可以干脆做

sed -e 's/dbservername.*$/dbservername yyy/g'
Run Code Online (Sandbox Code Playgroud)