使用grep在 文件 中搜索多行模式是很简单的。反转这种模式并没有那么多。
背景:我想创建没有密码的干净变量文件,以便我可以将它们提交到存储库中。
包含加密密码的变量文件示例:
ansible_user: rick
ansible_become_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
35623732646263636163383738353230626565383533626261313564383832643334363632383134
3833316539376436333462303564636236646662376535300a356631346166626632333365353465
30343138313363666434343938393464343861666234633434383037393230633333333364383835
3962383339373731610a316362326239386539633638646331636633333330633231383730323634
33653332353239353662366631373037653135303163663365633532643535663933
never: 'gonna,give,you,up'
预期结果:
ansible_user: rick
never: 'gonna,give,you,up'
我可以使用以下命令轻松匹配包含密码的行:
grep -Pz '.+\: !vault \|(\n\s+.+){2,}' host_vars/host.yml
问题:-v
通常会反转结果的参数不适用于-P
如何在没有密码行的情况下创建变量文件的副本?
这很骇人听闻,因为它不适用于您有其他多行变量,但在这种情况下:
所以它会跳过任何以空格开头的东西。如果你想要一个更优雅的解决方案,我会使用命令行程序来处理 yaml 文件,看看你是否可以排除值。使用 cli 处理 yaml 文件在本网站的其他帖子中有详细介绍:https ://stackoverflow.com/questions/5014632/how-can-i-parse-a-yaml-file-from-a-linux-外壳脚本
我让它工作了
pcregrep
:但这需要安装 pcregrep,至少在 ubuntu 上这不是标准的。因此,我仍然愿意接受更好的建议。