“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 第二个括号后向引用
我有一堆日志,我需要定期在其中替换密码和主机名等敏感信息。假设所有出现的地方都需要用关键字 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 第二个括号后向引用