使用sed替换带有特殊字符的字符串

时间:2016-03-17 23:29:12

标签: bash sed

我在文件中有以下字符串:“dd / mmm / YYYY:HH:MM:SS -0500” 并希望将其替换为实际日期,即“17 / Mar / 2016:18:14:40 -0500”

我尝试使用sed,但以下似乎不起作用

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500"
actualDate="17/Mar/2016:18:14:40 -0500"
sed -i "s#'$dateTemplate'#'$actualDate'#g" tmp.txt

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

尝试从'程序中删除单引号(sed):

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500"
actualDate="17/Mar/2016:18:14:40 -0500"
sed -i "s#$dateTemplate#$actualDate#g" tmp.txt

使用GNU sed版本4.2.1进行测试

<强>之前:

1. pre dd/mmm/YYYY:HH:MM:SS -0500 post
2. pre dd/mmm/YYYY:HH:MM:SS -0500 post

<强>后:

1. pre 17/Mar/2016:18:14:40 -0500 post
2. pre 17/Mar/2016:18:14:40 -0500 post

答案 1 :(得分:0)

编辑:我注意到你使用了不同的分隔符。我可以确认Michael Jaros&#39;是一个更准确的答案。

你需要逃避斜杠:

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500"
actualDate="17\/Mar\/2016:18:14:40 -0500"
sed -i "s/$dateTemplate/$actualDate/g" tmp.txt

我测试了那个工作。如果它没有,请告诉我。

答案 2 :(得分:0)

我会稍微自动化一下这个过程:

dateTemplate="dd/mmm/YYYY:HH:MM:SS -0500"

actualDateTemplate="+$(
    sed '
        s/\<dd\>/%d/g
        s/\<mmm\>/%b/g
        s/\<YYYY\>/%Y/g
        s/\<HH\>/%H/g
        s/\<MM\>/%M/g
        s/\<SS\>/%S/g
        # add more translations here if desired
    ' <<<"$dateTemplate"
)"

actualDate=$(date "$actualDateTemplate")

echo "foo $dateTemplate bar" | sed "s#$dateTemplate#$actualDate#g"
foo 17/Mar/2016:20:22:34 -0500 bar

总是存在这样的危险:dateTemplate变量将包含用作s///分隔符的字符,无论您使用什么字符。这个过程可以在shell中使用字符串操作完成,但这很乏味。