我在文件中有以下字符串:“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
任何帮助都将不胜感激。
答案 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)
你需要逃避斜杠:
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中使用字符串操作完成,但这很乏味。