有没有比在两次调用printf时更好的方法在BASH中双重转义(或转义两次)用户输入?

时间:2010-07-21 16:01:41

标签: bash printf escaping

此脚本将从用户读取旧值和新值,然后使用sed在文件中查找和替换它们。例如,如果我输入T T z和B B z,它将在文件中查找T \ T \ z并替换为B \ 乙\ ž。它有效,但我一直在努力使这更简洁。

我不需要中间变量$ ESC_OLD_PW和$ ESC_NEW_PW。是否有更强的 明智的 方式?

    #!/bin/bash
    read -sp "Old:" OLD_PW && echo
    read -sp "New:" NEW_PW && echo

    # Add escape characters to what user entered
    printf -v ESC_OLD_PW "%q" "${OLD_PW}"
    printf -v ESC_NEW_PW "%q" "${NEW_PW}"

    # Escape again for the sed evaluation.
    printf -v ESC_ESC_OLD_PW "%q" "${ESC_OLD_PW}"
    printf -v ESC_ESC_NEW_PW "%q" "${ESC_NEW_PW}"

    sed -i -e s/"${ESC_ESC_OLD_PW}"/"${ESC_ESC_NEW_PW}"/g $1

我尝试了以下内容:

    ~$ OLD_PW="T*T*z"
    ~$ printf "%q" $OLD_PW | xargs printf "%q"
    printf: %q: invalid conversion specification
    ~$

我已尝试过很多关于将东西放入printf的变化......有什么建议吗?

1 个答案:

答案 0 :(得分:3)

中级变量:

sed -i -e "s/$(printf '%q' $(printf '%q' $OLD_PW))/$(printf '%q' $(printf '%q' $NEW_PW))/g" $1