【问题标题】:SED substitute from variable containing special characters来自包含特殊字符的变量的 SED 替代
【发布时间】:2014-05-09 15:13:52
【问题描述】:

我想使用 SED 将 .txt 文件中包含的占位符 (##ERROR_MSG##) 替换为变量 ($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

【问题讨论】:

    标签: unix sed ora-12170


    【解决方案1】:

    唯一有效的方法是:

    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
    

    【讨论】:

      【解决方案2】:

      试试这个:

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

      由于$ERROR_MSG 中的文本包含斜线/,因此您的行无效。

      编辑:

      也试试这个 awk oneliner:

      awk -v t="$ERROR_MSG" '{sub(/##ERROR_MSG##/,t)}7' FILE.TXT
      

      【讨论】:

      • 解决方案不起作用:我仍然收到相同的错误消息
      • @user3299274 文本是很长的行还是多行的文本?
      • @user3299274 请尝试 awk。 (见答案)
      • awk 命令比 sed 命令健壮得多,但请注意,如果 $ERROR_MSG 包含与号 (&amp;),它将静默失败。试试echo "opq" | awk -v new="a&amp;b" '{sub(/opq/,new)}1'看看失败。
      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2021-06-11
      相关资源
      最近更新 更多