Использовать команду sed с переменными

Я пробовал все возможные решения, доступные в Stack Overflow и связанных с ним веб-сайтах, но не нашел решения. Я потратил достаточное количество времени на эту проблему и, наконец, опубликовал этот вопрос.

Я хочу использовать команду sed с переменными оболочки. Мой скрипт довольно прост:

 ## string to replace is the text after comma in the variable pc. to_replace=${pc#*,} echo $to_replace ##text to be replaced by the following line replace_with="PARTITIONED BY ($pc1);" echo $replace_with ## use sed command to replace. sed "s@$to_replace@$replace_with@" $entry ## $entry is the variable that contains the file name 

Две команды echo дают следующие выходы соответственно:

 PARTITIONEDED BY (date_key ); ## the text I want to be replaced PARTITIONED BY ( date_key int ); ## the text I want to replace with 

Я либо получаю сообщение об ошибке:

 sed: -e expression #1, char 2: unterminated `s' command 

или текст вообще не заменяется.

Кто-то, пожалуйста, помогите. Я использую Centos 6 (если это имеет значение). Заранее спасибо!

2 Solutions collect form web for “Использовать команду sed с переменными”

 sed: -e expression #1, char 2: unterminated `s' command 

В сообщении об ошибке говорится, что ошибка возникает во втором символе, что кажется любопытным. Я могу воспроизвести это, поставив новую строку в начале первой переменной:

 $ a=$'\nfoo' $ b='bar' $ sed "s@$a@$b@" sed: -e expression #1, char 2: unterminated `s' command 

Неожидаемая новая строка завершает команду sed. Помещение новой строки позже в a , конечно, даст ошибку для более позднего символа.

Вы уже распечатывали обе переменные ранее в скрипте, но они не цитировались, поэтому любые ведущие пробелы в них были удалены, а пробелы посередине отображались как одиночные пробелы.

Проверьте, что на самом деле содержат ваши переменные, с чем-то вроде этого:

 printf ">%s<\n" "$to_replace" printf "%q\n" "$to_replace" 

Последний – это функция Bash, которая отображает строку, указанную так, как Bash принимает в качестве входных данных. set -x также покажет, что входит в командную строку sed, но вам нужно будет заметить буквальную новую строку из ее вывода.

Итак, если есть единственная ведущая строка новой строки, вы можете удалить ее в начале скрипта:

 to_replace=${pc#*,} to_replace=${to_replace#$'\n'} 

(Вы могли бы объединить их в одну, но отдельные шаги, даже если новая строка не существует.)

Попробуй это

 sed -i -e "s@$to_replace@$replace_with@g" "$entry" 

где

  • -i означает заменить «на месте», если вы не используете -i заменить будет на стандартный вывод.
  • Передайте все строки в файле как отдельный аргумент, разделенный пробелом
  • Используя инструмент командной строки cURL на Mac, как можно получить данные запаса, которые возвращаются * без * запятых?
  • Выберите интерпретатор после запуска скрипта, например if / else внутри hashbang
  • grep с количеством отдельных паттернов
  • Искать каталоги для многострочной строки
  • Сценарий Bash SFTPing на удаленный сервер и загрузка файлов, cd в соответствующий каталог на локальной машине
  • Как подсчитать количество слов каждого предложения в файле с помощью команды оболочки?
  • Автоматическое выполнение сценария установки cli в терминале при запуске
  • Интерактивный скрипт bash
  • Спросить имя хоста в сценарии оболочки?
  • Проверьте, нет ли часов на машинах, где я могу только отправлять задания
  • Interesting Posts

    Разница между кошкой * и кошкой * >>

    Блокировать / предотвращать команду, если она была выполнена в течение последних x секунд / минут

    Debian VM Может видеть другие компьютеры в сети, но не может подключиться к WWW

    Учет «отсутствия памяти» из sysctl

    Перенос динамического порта ssh и tcpdump показывают открытый текст

    Что такое эквивалент Fedora /var/lib/dpkg/info/.prerm?

    Не удается создать другой раздел?

    Невозможно скомпилировать Apache: «Ошибка, библиотеки SSL / TLS отсутствовали или были недоступны»

    Анализ XML из сценария оболочки

    какой медиа-браузер / плеер поддерживает закладки в списке воспроизведения, который петли

    Обоснование для создания текстового сегмента пользовательского пространства начинается с 0x8048000

    Периодически перезапускать службу systemd

    Как распечатать только первое совпадение из каждой строки?

    Как добавить условие в цикл for во время подстановки, если строка равна нулю

    Есть ли способ передать переменную из выражения awk в функцию bash в качестве аргумента?

    Linux и Unix - лучшая ОС в мире.