在字符串中查找和替换日期/时间

时间:2010-09-18 23:23:17

标签: regex bash shell sed osx-snow-leopard

我已经制作了一个可行的正则表达式,但它不起作用。

echo "FileName.17:09:2010 4.16.PM.720p.mp4" | sed -E 's/\d{2}:\d{2}:\d{4}\ (\d|\d{2})\.(\d{2}|\d)\.((AM)|(PM))//g'

应输出:FileName..720p.mp4

但输出相同的“FileName.17:09:2010 4.16.PM.720p.mp4”。

3 个答案:

答案 0 :(得分:1)

\d[0-9]是否为有效的字符类?尝试将其替换为[:digit:]或{{1}}。请参阅sed

答案 1 :(得分:1)

#! /bin/sh
f="FileName.17:09:2010 4.16.PM.720p.mp4"
echo ${f%%.*}${f##*[AP]M}

这适用于包含与模式匹配的字符串的任何变量。请参阅Parameter Expansion for shell variables

使用sed,只需从第一个点删除到AM或PM。或者,如果文件名可能有无关的点,那么从第一个数字中删除':'到[AP] M,'s/\.[0-9]\+:.*\[AP]M//'

我认为sed方式可能更好;因为如果失败则返回原始字符串。 shell表达式不匹配会返回一些名称两次;但是可以轻松添加错误检查:对于名称中没有AM或PM的文件,它会失败。

echo FileName.17:09:2010 4.16.PM.720p.mp4|sed  -e 's/\..*[AP]M\././'

答案 2 :(得分:0)

bash$ echo "FileName.17:09:2010 4.16.PM.720p.mp4"|ruby -e 's=gets.chomp.split(".");puts [s[0],s[-2,2]].join(".")'
FileName.720p.mp4