Замените все вхождения символа в переменной с помощью скрипта korn

Часть написанного мной сценария Korn требует, чтобы я заменил все вхождения символа двумя вхождениями ( '' ). Я пытаюсь зарегистрировать некоторый SQL, который я генерирую в этом скрипте, в столбец в другой таблице, но одинарные кавычки должны быть заменены двумя экземплярами символа одиночной кавычки. Я знаю, что там должны быть примеры этой функции, но я не нахожу пример замены строки, характерный для переменных где угодно.

2 Solutions collect form web for “Замените все вхождения символа в переменной с помощью скрипта korn”

Есть ли какая-то особая причина, по которой вы не можете вызвать 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} , дважды используемая в следующем фрагменте: один раз для замены ' by '' и один раз для замены строк новой строки на '+char(10)+' . Если в строке ввода нет новых строк, вы можете опустить вторую команду назначения.

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

Эта конструкция также доступна в bash, но правила цитирования различны. Следующий фрагмент работает во всех ksh93, bash и 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")'" 
  • Удалить до первого вхождения, отредактировать эту строку и распечатать оставшиеся строки без изменений
  • Как заменить слово внутри файла .DOCX с помощью командной строки Linux?
  • Grep для строки, а затем повторить строку из записи
  • Как сопоставить и заменить значение атрибута внутри тега
  • В POSIX sed период (точка) соответствует новой строке в многострочном пространстве шаблонов?
  • Сценарий для извлечения выбранных записей из файла bibtex
  • Отфильтруйте пути из текстового файла, который глубже, чем их непосредственный предшественник
  • Назначения значений двойной кавычки, хранящиеся в CSV?
  • Искать текст в Linux, но не отображать полную строку в результатах
  • Как удалить первую точку перед первым номером?
  • Скопируйте первые 2 строки из файла, а затем удалите строки
  • Linux и Unix - лучшая ОС в мире.