通过`sed`命令就地修改日期格式

Ali*_*van 6 sed shell-script date

我正在尝试修改文本中的日期,其中有 as2016-Dec-242016-12-24,我必须像24/12/2016.

有什么方法可以sed -i用来做到这一点吗?

输入示例:

假日或纪念日 宗教团体日期 附加说明 *犹太新年(新年) 犹太教 2014 年 9 月 25 日 - 2014 年 9 月 26 日 为观察员指定的非工作日 Navaratri/Dassehra 印度教 2014 年 10 月 3 月

*赎罪日(赎罪日)犹太人 2014 年 10 月 4 日,观察员指定的非工作日

赞助会议 名称 地点 会议 日期 2017 IEEE Sensors Applications Symposium (SAS) United States 2017-03-13, 2017-03-14, 2017-03-15 2017 IEEE International Symposium on Medical Measurements and Applications (MeMeA) United States 2017-05 -07 至 2017-05-10 2017 IEEE 国际仪器与测量技术大会(I

这就是我到目前为止所尝试的。

sed -i -e 's/\([0-9]\{4\}\)-\(01|Jan\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(02|Feb\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(03|Mar\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(04|Apr\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(05|May\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(06|Jun\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(07|Jul\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(08|Aug\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(09|Sep\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(10|Oct\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(11|Nov\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
sed -i -e 's/\([0-9]\{4\}\)-\(12|Dec\)-\([0-9]\{2\}\)/\3\/\2\/\1/g' $1
Run Code Online (Sandbox Code Playgroud)

ter*_*don 5

如果您可以访问 GNU date(Linux 系统上的默认设置),您可以执行以下操作:

$ sed -E 's/(.*)-([a-z]+)(.+)/\2\3-\1/i' file | 
    while read d; do date -d "$d" +%d/%m/%y; done
24/12/16
24/12/16
Run Code Online (Sandbox Code Playgroud)

这将更2016-Dec-24改为Dec-24-2016(GNUdate可以理解的格式)之类的行,将2016-12-24(GNU 日期已经理解的格式)之类的行单独保留,然后将每一行作为输入日期字符串传递给date. 它不会就地执行,也不会使用,sed -i但几乎可以肯定是最简单的方法。

如果您确实需要使用sed,您可以列出所有月份和相应数字:

$ for m in {1..12}; do printf '%s %s\n' "$m" $(date -d "$m/1/2016" +%b); done
1 Jan
2 Feb
3 Mar
4 Apr
5 May
6 Jun
7 Jul
8 Aug
9 Sep
10 Oct
11 Nov
12 Dec
Run Code Online (Sandbox Code Playgroud)

将其另存为months,然后对其进行迭代以修改您的文件:

while read num mon; do 
    sed -Ei "s/$mon/$num/; s#(.*)-(.*)-(.*)#\3/\2/\1#" file
done < months 
Run Code Online (Sandbox Code Playgroud)

或者,如果您的 sed 实现需要单独的-e

while read num mon; do 
    sed -i -e "s/$mon/$num/" -Ee 's#(.*)-(.*)-(.*)#\3/\2/\1#' file
done < months 
Run Code Online (Sandbox Code Playgroud)

第一个替换将用相应的数字替换所有按字母顺序排列的月份名称,第二个替换为您想要的格式。