正则表达式无效

时间:2017-08-24 09:32:30

标签: sed

我正在使用下面的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,

1 个答案:

答案 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