当字符串匹配时不运行这个 sed 吗?

当字符串匹配时不运行这个 sed 吗?

我有这个sed命令用于删除标签内的数字:

sed 's/\(<[^0-9>]*\)[0-9]*\([^0-9]*>\)/\1\2/g'

但有谁知道我如何从中排除某些字符串?

现在会是这样,输入:

<user1></user1>
<password2></password2>

并输出:

<user></user>
<password></password>

但是,我希望能够排除某些字符串,例如password2,那么输出将如下所示:

<user></user>
<password2></password2>

答案1

您可以预处理文件,为要列入白名单的字符串插入特殊字符,以防止它们被替换。

就像你会改变:

<user1></user1>
<password2></password2>

<user1></user1>
<|password2><|/password2>

首先并用于s/\(<[^|0-9>]*\)[0-9]*\([^0-9]*>\)/\1\2/g替换。如果|可能已经出现在输入中,您可以使用类似以下的方案来转义它们:_-> _u, |->_p之后您可以撤消它们。

sed '
  s/_/_u/g;s/|/_p/g
  s:<\(/\{0,1\}password2>\):<|\1:g
  s:<\(/\{0,1\}othertag>\):<|\1:g
  s/\(<[^|0-9>]*\)[0-9]*\([^0-9]*>\)/\1\2/g
  s/|//g;s/_p/|/g;s/_u/_/g'

相关内容