如何在bash中使用sed命令在符号之间替换

棕色

因此,我最近请求sed命令来帮助您替换符号第一次出现和第二次出现之间的文本。这是该问题的链接:如何在符号的第一次出现和它的第二次出现之间的特定行中替换文本

现在,我需要类似的内容,在第二次和第三次出现之间,以及第三行到行尾之间进行替换

假设我有这个文本文件:

aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:llll
sed "${lineNumber}s/:[^:]*/:${passwd}/" users.txt

该行的作用是在给定行的第一和第二“:”之间进行替换,因此问题是该命令应如何在第二和第三“:”之间以及第三至行的末尾进行替换。

因此,例如,用“ ####”替换第三行的第二到第三行的输出如下所示:

aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:####

和代码

sed "${lineNumber}s/:[^:]*/:${passwd}/" users.txt
                    ^^^^^^ I think that is what should be replaced
维克多·史翠比维

您可以使用

sed -E "${lineNumber} s/^(([^:]*:){2})[^:]*/\1${passwd}/"

参见在线sed演示

s='aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:llll'
passwd='newpass'
lineNumber=2
sed -E "${lineNumber} s/^(([^:]*:){2})[^:]*/\1${passwd}/" <<< "$s"

输出(请参见第二行第二和第三冒号之间的文本):

aaaa:bbbb:cccc:dddd
eeee:ffff:newpass:hhhh
iiii:jjjj:kkkk:llll

细节

  • ^ -字符串开始
  • (([^:]*:){2})-第1组(此值\1由regex替换模式中占位符引用):两次出现的除以外的任何字符:,然后:
  • [^:]*-零个或多个字符,而不是:

请注意,它{2}是一个范围量词,在指定的时间内匹配其修改的模式。如果将其更改为{3},它将在第三次出现:char后替换

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章