Я хочу использовать SED, чтобы заменить заполнитель (## ERROR_MSG ##), содержащийся в файле .txt, содержимым переменной ($ ERROR_MSG)

Вот команда, которую я использую:

cat FILE.TXT  |  sed "s/##ERROR_MSG##/$ERROR_MSG/"

Вот что содержится в $ ERROR_MSG (содержит специальные символы и является многострочным)

ERROR:
ORA-12170: TNS:Connect timeout occurred

ERROR:
ORA-12162: TNS:net service name is incorrectly specified

SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM}] [edition=value]] where    <logon> ::= <username>[/<password>][@<connect_identifier>]
<proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus

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

sed: -e expression #1, char 22: unterminated `s' command
0
user3299274 9 Май 2014 в 19:13

2 ответа

Лучший ответ

Единственный надежный способ сделать это, который будет работать с любым значением $ ERROR_MSG, - это:

awk -v old="##ERROR_MSG##" -v new="$ERROR_MSG" 's=index($0,old){$0 = substr($0,1,s) new substr($0,s+length(old))} 1' file
0
Ed Morton 10 Май 2014 в 15:33

Попробуй это:

sed "s+##ERROR_MSG##+$ERROR_MSG+" FILE.TXT

Ваша строка не работает, потому что текст в $ERROR_MSG содержит косую черту /.

Редактировать:

Попробуйте и этот awk oneliner:

awk -v t="$ERROR_MSG" '{sub(/##ERROR_MSG##/,t)}7' FILE.TXT
0
Community 20 Июн 2020 в 09:12