我需要在POST HTTP请求中发送日期(格式为2011-06-07T05:34:28 + 0200)。为了实现这一点,我需要分别用'%2B'或'%2D'来改变时区的'+'或' - '。在bash / sed one liner中执行此操作的最有效方法是什么?
以下只更改'+',因为只有一个'+'(时区中的一个)。
d1=$(date +%Y-%m-%dT%H:%M:%S%z) // -> 2011-06-07T05:34:28+0200
d2=$(echo $d1 | sed -e 's/+/%2B/')
如何在单个命令中仅在时区中更改“+”或“ - ”字符?
答案 0 :(得分:1)
在Perl中你可以试试这个:
perl -M'POSIX strftime' -l -e'%rep=( "+" => "%2B", "-" => "%2D"); $d= strftime( "%Y-%m-%dT%H:%M:%S%z", localtime()); $d=~s{([+-])}{$rep{$1}}g; print $d'
基本上捕获'+'或' - '并用适当的转义值替换它们。
然后进一步思考它,应该有一个模块来逃避你的URL。事实上,这就是URI :: Escape的作用,所以你去了:
perl -M'POSIX strftime' -MURI::Escape -l -e'$d= strftime( "%Y%%2D%m-%dT%H:%M:%S%z", localtime()); print uri_escape $d'
我无法相信没有什么可以缩短可怕的"%Y%%2D%m-%dT%H:%M:%S%z"
strftime格式。
更新:所以在采取了glenn jackman的评论并删除了额外的变量后,最终的单行将是:
perl -M'POSIX strftime' -MURI::Escape -E'say uri_escape strftime "%FT%T%z", localtime'
答案 1 :(得分:0)
d1=$(date +%Y-%m-%dT%H:%M:%S%z)
d2=$(echo $d1 | sed -e 's/+([0-1][0-9]00)/%2B\1/' | sed -e 's/-([0-1][0-9]00)/%2D\1/')