shell bash, файл cat при использовании sed для замены текста

С помощью SO я смог исправить свою команду sed, чтобы я мог использовать переменные (использовал «вместо» и не использовал g для глобального).

Тем не менее, я изо всех сил пытаюсь заставить команду работать правильно.

Чтобы дать вам некоторый контекст, у меня есть файл, содержащий множество строк текста, и некоторые строки содержат один или несколько тегов. эти теги имеют следующий формат:

[#$key#] - i.e #[#] is used to indicate the presence of a key

Затем у меня есть объект внутреннего массива, в котором хранится строковое значение, содержащее каждый ключ и соответствующее значение в следующем формате:

$key=$value

То, что я пытаюсь сделать, это вывести мой файл, содержащий теги, одновременно с использованием глобальной замены sed для замены ключа $ на соответствующее значение в объекте массива.

У меня проблема в том, что моя команда grep/sed не заменяет текст, и я не могу понять, почему.

вот мой код:

for x in "${prop[@]}"
do
     key=`echo "${x}" | cut -d '=' -f 1`
     value=`echo "${x}" | cut -d '=' -f 2`


    # global replace on the $MY_FILE
    cat $MY_FILE | sed "s|\[#${key}#\]|${value}|g" > ${TEMP_MY_FILE}
    cat $TEMP_MY_FILE > $MY_FILE

 done

Я думал об использовании sed -i, но моя версия, похоже, не поддерживает-i


person Pectus Excavatum    schedule 20.01.2014    source источник
comment
Не нужно cat file | sed > new_file. Вместо этого сделайте sed ... file > new_file.   -  person fedorqui 'SO stop harming'    schedule 20.01.2014
comment
Кажется, у вас есть проблема со строками, которые также устанавливают key и value, что, я думаю, вызовет некоторые ошибки.   -  person chepner    schedule 20.01.2014
comment
переменные ключа и значения, как и ожидалось, повторили их, чтобы перепроверить   -  person Pectus Excavatum    schedule 20.01.2014
comment
используйте set -x в начале вашего скрипта и отлаживайте его таким образом   -  person Jakub Kotowski    schedule 20.01.2014
comment
Для дальнейшего использования sed -i ... inputfile — это просто сокращение для sed ... inputfile > tmpfile; mv tmpfile inputfile. Это просто избавляет вас от необходимости указывать это явно...   -  person twalberg    schedule 20.01.2014


Ответы (1)


Хотя [ не имеет особого значения в строке bash в двойных кавычках, \[ по-прежнему оценивается как [, поскольку обратная косая черта обрабатывается для обеспечения экранирования знаков доллара. Пытаться

sed "s|\\[#${key}#\\]|${value}|g"

как ваша команда sed. Двойная обратная косая черта приведет к тому, что буквальная обратная косая черта будет отправлена ​​​​на sed, которая будет использовать ее для экранирования [, чтобы также обрабатывать его буквально.

person chepner    schedule 20.01.2014
comment
моя версия (для соляриса) не поддерживает -i боюсь - person Pectus Excavatum; 20.01.2014
comment
когда я использую set -xv в сценарии, кажется, что строка $key в grep интерпретируется как [\#\e\x\a\m\p\l\e_\k\e\y\#] вместо [#example_key#] - person Pectus Excavatum; 20.01.2014