我正在使用下面的sed删除字符串
sed -ie's / ^ \ s worker .. .balance_workers =(。)pgnode2(。)/ worker .. *。balance_workers = \ 1 \ 2 /'worker.txt
我的内容是:
`#worker.stgpgloadbalancer.balance_workers = worker.stgpgloadbalancer.balance_workers = pgnode1,pgnode2 worker.stgpgloadbalancer.sticky_session = 1
worker.stgadminloadbalancer.type =磅 worker.stgadminloadbalancer.balance_workers = stgadmin2,stgadmin1 worker.stgadminloadbalancer.sticky_session = 1`
我想从上面的表达式中删除pgnode1 结果:
工人.. *。balance_workers = pgnode1,
预期结果: worker.stgpgloadbalancer.balance_workers = pgnode1,
答案 0 :(得分:1)
你错过了转义字符。
尝试:
sed -ie 's/worker\.stgpgloadbalancer\.balance_workers=pgnode1,pgnode2\?\(.*\)/worker.stgpgloadbalancer.balance_workers=pgnode2/' worker.txt
<强>更新强>
你改变了最初的正则表达式但是现在(除了缺少初始/来自sed你正在使用()而没有转义,这些字符将从模式的一部分看到)。
如果您只想删除pgnode1,只需执行以下操作:
sed -ie 's/worker\.stgpgloadbalancer\.balance_workers=\(.*\)pgnode1,\(.*\)/worker.stgpgloadbalancer.balance_workers=\1\2/' worker.txt
首先,使用反斜杠正确地转义所有内容。 然后在pgnode1之前创建两个组,在pgnode1之后创建另一个组。
然后继续用group1替换属性,然后用group2替换,删除pgnode1。
更新2
如果你想避免注释的行可能被改变,那么改变就说开头需要是空格或者不是以下内容:
sed -ie 's/^\s*worker\.stgpgloadbalancer\.balance_workers=\(.*\)pgnode1,\(.*\)/worker.stgpgloadbalancer.balance_workers=\1\2/' worker.txt
更新3
您真的需要改进如何在一个问题中解释您的要求:-)您已经完成了多少次问题编辑?那真的不重要......
如果要匹配worker.xxxxxx.balance_workers格式的所有属性,其中xxxxxx是可变的,您需要为它创建一个组,以便您可以在表达式中替换它。
如下所示:
sed -ie 's/^\s*worker\.\(.*\)\.balance_workers=\(.*\)pgnode1,\(.*\)/worker.\1.balance_workers=\2\3/'
我们已基本删除了表达式stgpgloadbalancer,并将其替换为允许任何\(.*\)
的组。由于这是第一组,因此我们在替换模式中使用\1
。