grep 排除多行模式

grep 排除多行模式

搜索多线模式 文件 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

如何创建没有密码行的变量文件的副本?

答案1

这是很不礼貌的,因为如果你有其他多行变量它就无法工作,但在这种情况下:

grep -v -e password -e '^\s'

因此,它会跳过以空格开头的任何内容。如果您想要更优雅的解决方案,我会使用命令行程序来处理 yaml 文件,看看是否可以排除值。使用 cli 处理 yaml 文件已在本站的其他帖子中详细介绍:https://stackoverflow.com/questions/5014632/how-can-i-parse-a-yaml-file-from-a-linux-shell-script

答案2

我使用以下方法使它工作pcregrep

pcregrep -vM "\!vault.+\n(\s{4,}.+\n){2,}" host_vars/host.yml

但这需要安装 pcregrep,至少在 ubuntu 上这不是标准。因此我仍然愿意接受更好的建议。

相关内容