Использовать команду 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 заменить будет на стандартный вывод.
  • Выход Grep Wvdial во время работы
  • Где продолжение строки bash после && и || документально?
  • Нужна команда для отображения эха «успех»
  • Подкатегории MV на один уровень, но не root
  • Как добавить арифметические переменные в скрипт
  • Переменная в Bash, содержащая кавычки и пробелы
  • Сценарий оболочки не работает, чтобы открыть LimeChat через терминал
  • Обмен переменными в нескольких сценариях оболочки
  • Отображать строку в текстовом файле, если переменная соответствует части в строке?
  • Rsync ведет себя по-другому, если вызывается внутри скрипта
  • Простой «переменный» файл Bash
  • как войти с помощью ssh с паролем?
  • Interesting Posts

    Bash: укажите конкретный файл вместо меню выбора файла.

    Разрешение всей подсети на сервере Ubuntu 11.10

    Как работает автозаполнение Bash?

    nohup vs. Screen

    Как отлаживать пользовательское действие Thunar

    Разрешение отклонено, когда я попытался создать папку в корне

    Установка MySQL на CentOS вызывает ошибку, которая не может найти mysqld.sock

    OverlayFS – Как сделать изменения в верхней файловой системе постоянными без размонтирования?

    Почему / etc / passwd открыт для публики для чтения?

    можно ли настроить сортировку по умолчанию списка файлов в диалоговом окне «Открыть файл» gnome?

    Разрешения на запись пользователя в chrooted SFTP

    отключить порт USB в Linux

    Графический интерфейс Gnome не загружен

    Удалить несколько регулярных выражений из переменной с помощью sed

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

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