CentOS должен иметь Вкусный репозиторий EPEL, включенный для установки пакета завершения удара.
См. https://fedoraproject.org/wiki/EPEL для деталей.
Есть ли какая-то конкретная причина, которую Вы не могли назвать sed
из Вашего ksh
сценарий?
Этот простой сценарий:
#!/bin/ksh
foo="left ' right"
echo $foo
foo=$(echo "$foo" | sed "s#\'#\'\'#g")
echo $foo
дает мне этот вывод:
left ' right
left '' right
В 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")'"
printf "%s\n"
вместо %s
?
– glenn jackman
04.08.2011, 18:09