Есть ли лучший способ удвоить (или дважды убежать) пользовательский ввод в BASH, чем дважды вызывать printf? - PullRequest
3 голосов
/ 21 июля 2010

Этот скрипт будет читать старое и новое значение от пользователя, а затем использовать sed, чтобы найти и заменить их в файле.Например, если я ввел T T z и B B z, он будет искать T \ T \ z в файле и заменить на B \ 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 Ответ

3 голосов
/ 21 июля 2010

без промежуточных переменных:

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