强制 sed 忽略空格

Posted

技术标签:

【中文标题】强制 sed 忽略空格【英文标题】:Force sed to ignore white space 【发布时间】:2017-10-04 08:02:50 【问题描述】:

我正在使用 sed 处理一个 XML 文件。要替换的文件内容如下。

<NS1:myService>
    <NS1:code>1</NS1:code>
    <NS1:timestamp>Event_Time_Stamp</NS1:timestamp>
    <NS1:log>
        <NS1:logLevel>some_level</NS1:logLevel>
        <NS1:loggerName>log_back</NS1:loggerName>
        <NS1:message>loggable_message</NS1:message>
            <NS1:node>none</NS1:node>
            <NS1:host>my_host</NS1:host>
    </NS1:log>
</NS1:myServices>

我需要用我的文本替换节点的内容。每当包含我的文本的变量没有空间时,它都会起作用。只要有空间 sed 就会抛出错误。

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

这是我在脚本中创建消息的方式

 text="APPLICATION:\t\t$app\n"
 text=$text"RECEIVER:\t\t$receiver\n"
 text=$text"LOGGABLE MESSAGE:\t$message\n"
 text=$text"SENDER:\t\t$sender\n"
 text=$text"DATE CREATED:\t$created\n"

我使用以下 sed 语句进行替换

sed -i 's|<NS1:message>.*<|<NS1:message>'$text'<|g' $workfile

但是,上述命令每次在空间上都会中断。如何转义空格,以便 sed 像处理任何其他字符一样处理它?

【问题讨论】:

使用 XML 解析器(例如 xmlstarlet)。 如果我可以使用 XML 解析器,我会问这个问题,但我需要使用 sed。不过感谢您的尝试。 @svager 为什么需要使用 sed? 简答是我公司“标准”工具包的一部分。 请注意:他不想解析 xml。他想在一行中替换一些简单的字符串。 sed 非常适合这种情况。当然,xmlstarlet 是完美的工具——但你不需要一个图钉的锤子...在一行中区分 解析替换文本... 【参考方案1】:

我一发布问题就想通了。我需要你使用 "

命令如下所示

sed -i 's|<NS1:message>.*<|<NS1:message>'"$text"'<|g' $workfile

【讨论】:

以上是关于强制 sed 忽略空格的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sed Mac 终端查找和替换空格

如何防止 sed 插入空格?

使用 sed 进行替换时如何放置空格?

sed / awk - 使用模式匹配后插入空格

sed常用方法

shell 中如何去掉字符串中间的空格