Sed命令不会用特殊字符替换字符串

时间:2014-12-08 11:14:38

标签: regex bash sed

我有一个从" .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

这是一份测试文件。

DONEDIRECTORY

错误:

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

注意: 如果我改变" DoneDirectory"的值简单的字符串,即"完成" ,它工作正常。但是" /"逃避角色它不起作用。

3 个答案:

答案 0 :(得分:5)

问题不是使用sed命令,而是使用变量$DoneDirectory的内容。

在sed命令中

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

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

<强>解决方案

使用sed中的其他一些分隔符

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

注意:如果gsub在一行中显示多次,则应使用sub代替DONEDIRECTORY,然后应替换它们。