【问题标题】:Sed command does not replace string with special characters [duplicate]Sed 命令不会用特殊字符替换字符串 [重复]
【发布时间】:2014-12-08 19:20:48
【问题描述】:

我有一个从“.properties”文件中获取值的脚本。如果它是一个简单的字符串,它会成功替换该值,但如果包含像 ('\') 这样的转义字符,它就不起作用。任何人都可以指出该怎么做,我在互联网上搜索但无法理解“REGEX”。

脚本文件:

#!/bin/bash
# Omer's First Script
#Include Properties File
. directoryPaths.properties
echo "Start"

sed -i "s/DONEDIRECTORY/$DoneDirectory/" *TestFile*



echo "finish"

directoryPaths.properties

DoneDirectory=/home/omerkhalid/Documents/Test/Done

TestFile.txt

这是一个测试文档。

完成目录

错误:

sed: -e expression #1, char 18: unknown option to `s'

注意: 如果我将 "DoneDirectory" 的值更改为简单的字符串,即 "Done" ,它工作正常。但是使用“/”转义字符它不起作用。

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:

    问题不在于 sed 命令,而在于变量 $DoneDirectory 的内容。

    在 sed 命令中

    sed -i "s/DONEDIRECTORY/$DoneDirectory/" *TestFile*
    

    / 用作分隔符,seds 命令之后只需要 3 个斜杠。但是一旦变量 $DoneDirectory 被替换,就会有 8 个 / 给出错误

    解决方案

    sed 中使用其他一些分隔符

    sed -i "s#DONEDIRECTORY#$DoneDirectory#" *TestFile*
    

    【讨论】:

      【解决方案2】:

      由于变量 $DoneDirectory 包含 sed 的默认命令分隔符 / 我会使用不同的分隔符:

      sed -i "s#DONEDIRECTORY#$DoneDirectory#" *TestFile*
      

      【讨论】:

        【解决方案3】:

        我认为 sed 不是这项工作的正确工具。当然,您可以使用其他分隔符,但如果其他分隔符出现在您的字符串中(或反斜杠,或 sed 解释的其他内容),它仍然会爆炸。我相信 awk 更适合:

        awk -v subst="$DoneDirectory" '{ sub("DONEDIRECTORY", subst); print $0 }' TestFile
        

        注意:如果DONEDIRECTORY 可以在一行中出现多次并且都应该被替换,则使用gsub 而不是sub

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-12
          • 2019-10-14
          • 1970-01-01
          • 1970-01-01
          • 2014-07-29
          • 2021-11-17
          相关资源
          最近更新 更多