2

В моем сценарии оболочки есть строка в фиксированном формате: '[STATUS REPORT] PROJECT' . Когда пользователь выполняет мой сценарий оболочки, ему будет предложено указать значение для 'PROJECT' .

Я хотел бы заменить слово 'PROJECT' на значение, предоставленное пользователем. Например, если 'ABCD' был введен пользователем:

'[СОСТОЯНИЕ ОТЧЕТА] ABCD'

У меня есть две проблемы: 1. Как использовать специальные символы, такие как «&» в названии проекта? Например:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A&A"); print }' 

и я получаю следующий вывод:

[СОСТОЯНИЕ ОТЧЕТА] APROJECTA

2: мой фактический оператор оболочки выглядит так:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, $ProjectName); print }'

где $ ProjectName хранит имя проекта, предоставленное пользователем. Но это не похоже на работу

Как я могу заставить это работать должным образом?

2 ответа2

5

Это решит вашу первую проблему:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A\\&A"); print }'

(& - это специальный символ в замене awk: это означает "что было найдено". Вам нужно убежать, если с \ . И поскольку вы находитесь в строке awk, вам нужно поставить 2 \ чтобы получить один из них, \ escape следующего символа как в \n .)

Это решит ваш второй вопрос:

ProjectName=toto
echo "[STATUS REPORT] PROJECT" |  awk -v "ProjectName=$ProjectName" '{ gsub(/PROJECT/, ProjectName); print }'

(Изменить: обратите внимание на недавно добавленное " вокруг ProjectName=$ProjectName чтобы пробел в ProjectName не нарушал сценарий.)

Но awk - это большой инструмент для подстановки строк, вы можете использовать sed:

echo "[STATUS REPORT] PROJECT" |  sed -e 's/PROJECT/A\&A/'
ProjectName=toto;
echo "[STATUS REPORT] PROJECT" |  sed -e "s/PROJECT/${ProjectName//\//\\/}/"

(Изменить: a / в ProjectName будет нарушать первоначальное решение. Я добавил экранирование косых черт, но некоторые другие символы все еще ломают его: & , \1 , ... Я думаю, что простая оболочка Bash ниже безопаснее.)

или в простой оболочке bash:

msg="[STATUS REPORT] PROJECT"
echo ${msg//PROJECT/A&A}
ProjectName=toto
echo ${msg//PROJECT/$ProjectName}
3

(Извините, у меня нет прав комментирования здесь)

Из фрагмента, который вы разместили, не очень понятно, почему вам нужно передать строку в awk .

Вы можете просто использовать переменную внутри оператора echo и bash заменит переменную:

echo "[STATUS REPORT] $ProjectName"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .