sed 替换中的嵌套命令

Mun*_*ody 2 command-line bash sed text-processing ansible

我正在尝试用于在库存文件中sed查找和加密ansible_password字段并使用ansible-vault命令对其进行加密。但是ansible-command没有抛出sed错误,因为简单的回声工作正常。

sed -n "s/\( *\)\(ansible_password\: *\)\"\(.*\)\"/$(echo \\3)/p" sample.yml
Run Code Online (Sandbox Code Playgroud)

输出没有双引号的属性值。

ansible-vault命令:

sed -n "s/\( *\)\(ansible_password\: *\)\"\(.*\)\"/$(ansible-vault encrypt_string --vault-password-file ~/password.txt --name 'ansible_password' '\\3')/p" sample.yml
Run Code Online (Sandbox Code Playgroud)

正在抛出错误消息: sed: -e expression #1, char 67: unterminated ``s' command

这是发生替换的行:

        ansible_password: "somepassword"
Run Code Online (Sandbox Code Playgroud)

pLu*_*umo 6

这是行不通的。嵌套命令将首先运行。echo偶然工作,因为它会\3作为替换模式,在这种情况下恰好是您想要的(= 输出原始值)。

不知道你到底想要什么,也许你可以尝试grepxargs

grep -Po 'ansible_password: \K"[^"]*' sample.yaml \
| xargs -n1 ansible-vault encrypt_string --vault-password-file ~/password.txt --name 'ansible_password'
Run Code Online (Sandbox Code Playgroud)

但是,您可能希望使用适当的yaml解析器而不是grepsed