Замените все случаи символа в использовании переменной сценарий Korn

CentOS должен иметь Вкусный репозиторий EPEL, включенный для установки пакета завершения удара.

См. https://fedoraproject.org/wiki/EPEL для деталей.

4
03.08.2011, 23:31
2 ответа

Есть ли какая-то конкретная причина, которую Вы не могли назвать sed из Вашего ksh сценарий?

Этот простой сценарий:

#!/bin/ksh

foo="left ' right"
echo $foo
foo=$(echo "$foo" | sed "s#\'#\'\'#g")
echo $foo

дает мне этот вывод:

left ' right
left '' right
-1
27.01.2020, 20:54
  • 1
    Всегда подстановки переменных двойной кавычки. Как записано, это искажает подстановочные символы оболочки и пробел; это оставляет вполне достаточные дыры для взломщика. @Ben не используют этот код, он повреждается. (Я обычно фиксирую, а не downvote в таких случаях, но это - вопрос о заключении в кавычки!) –  Gilles 'SO- stop being evil' 03.08.2011, 23:32

В ksh93 и zsh, существует строковая заменяющая конструкция ${VARIABLE//PATTERN/REPLACEMENT}, используемый дважды в следующем отрывке: однажды для замены ' '' и однажды заменять новые строки '+char(10)+'. Если нет никаких новых строк во входной строке, можно опустить вторую команду присвоения.

quoted_string=\'${raw_string//\'/\'\'}\'
quoted_string=${quoted_string//$'\n'/"'+char(10)+'"}

Эта конструкция также доступна в ударе, но правила заключения в кавычки отличаются. Следующий отрывок работает во всех ksh93, ударе и zsh.

quoted_string=\'${raw_string//$'\''/$'\'\''}\'
quoted_string=${quoted_string//$'\n'/$'\'+char(10)+\''}

В ksh88 и других оболочках, необходимо записать относительно сложный цикл для замены одинарных кавычек по одному. Следующий отрывок удваивает одинарные кавычки, но оставляет новые строки без изменений).

q="$raw_string"; quoted_string=
while
    quoted_string="$quoted_string'${q%%\'*}'"
    case "$q" in *\'*) q="${q#*\'}";; *) false;; esac
do :; done

С другой стороны, можно использовать sed. Будьте осторожны при питании данных к sed, как echo не всегда печатает его аргумент как есть.

quoted_string="'$(printf '%s\n' "$raw_string" |
                  sed -n -e "s/'/''/g" -e 'H' \
                      -e '$ g' -e 's/^\n//' -e "s/\\n/'+char(10)+'/g" -e '$ p')'"

Если нет никаких новых строк в строке, следующая намного более простая команда sed достаточна.

quoted_string="'$(printf '%s\n' "$raw_string" | sed -e "s/'/''/g")'"
6
27.01.2020, 20:54
  • 1
    +1. С последним примером я получаю предупреждение "sed: Пропавшие без вести новой строки в конце входа стандарта файла". - Вы имеете в виду printf "%s\n" вместо %s? –  glenn jackman 04.08.2011, 18:09
  • 2
    @glenn Да (я протестировал, но с GNU sed, который не заботится о заключительных новых строках). Спасибо за это; также Ваш комментарий заставил меня понять, что это была бы хорошая идея заменить новыми строками во входной строке, даже если бы это не было в вопросе Ben. –  Gilles 'SO- stop being evil' 04.08.2011, 19:14

Теги

Похожие вопросы