“sed”用参数替换模棱两可的模式

“sed” replace ambiguous pattern along with argument

我有一堆日志,我需要定期在其中替换密码和主机名等敏感信息。假设所有出现的地方都需要用关键字 REMOVED 替换。我不能删除它们,因为需要证明数据在那里。

必须使用 sed

不幸的是,我 运行 遇到了几个用例的问题:

这里的目标是“密码”关键字和参数(正确的传递)。之后的所有内容都应该保持不变(请勿删除)。需要多个“密码”组合,例如:

password secret123 do-not-delete
password: secret123 do-not-delete
password = secret123 do-not-delete
app_password=secret123 do-not-delete

这里有几个主机名示例。期待“web-* 和”chicagonode*”,与上面相同 - 主机名后的所有内容必须保留:

web-one do-not-delete
web-two do-not-delete
chicagonode1 do-not-delete
chicagonode2 do-not-delete

我试过类似的方法,但它不起作用:

sed “s/password.+\[:alnum:\]/REMOVED/gi” logfile.txt 

有人知道如何解决这个难题吗? 可以是多个sed命令,不需要一行。

编辑:

感谢 HatLess! 您的命令有效,但它也删除了不应删除的关键字,即:下面示例中的“一六”:

parallels@debian-gnu-linux-10:/media/psf/Home$ cat input 
one two three
four fife
six
password secret123 
password: secret123 do-not-delete
password = secret123 do-not-delete
app_password=secret123 do-not-delete
web-one do-not-delete
web-two do-not-delete
chicagonode1 do-not-delete
chicagonode2 do-not-delete
parallels@debian-gnu-linux-10:/media/psf/Home$ sed 's/\(password[^[:alpha:]]*\)\?[^ ]*\(.*\)/REMOVED/' input
REMOVED two three
REMOVED fife
REMOVED
REMOVED 
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete

我们正在尝试仅删除“passwordsecret123”、“web-、chicagonode*”。

抱歉造成混淆。

使用sed

$ cat input_file
password secret123 do-not-delete
password: secret123 do-not-delete
password = secret123 do-not-delete
app_password=secret123 do-not-delete
web-one do-not-delete
web-two do-not-delete
chicagonode1 do-not-delete
chicagonode2 do-not-delete
$ sed 's/\(password[^[:alpha:]]*\)\?[^ ]*\(.*\)/REMOVED/' input_file
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
REMOVED do-not-delete
  • \(password[^[:alpha:]]*\)\? - 可选组,如果在模式中,它将匹配从密码到下一个字母字符的出现。 ? 使其成为可选的。尽管在组括号中,但它会被排除在外,因为它不会在带有反向引用 </code></p> 的替换中调用 </li> <li><p><code>[^ ]* - 如果模式不是以密码开头,那么从这里开始。这将匹配 space 的下一次出现。由于不在括号内,因此将被排除。

  • \(.*\) - 匹配其他所有内容。这是在第二个括号内,因此可以保留并通过反向引用返回 </code></p> </li> <li><p><code>/REMOVED/' - 将排除的所有内容替换为 REMOVED Return 第二个括号后向引用