如何使用sed或grep仅提取格式化的日期字段?

时间:2013-01-17 04:40:42

标签: regex bash sed awk grep

我需要一个grep或sed语句,只能从这个语句中删除日期:

echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' 

所以答案应该是这样的:

12-Dec-13 11-Jan-12

我已经足够得到12-Dec-13 asdasd asdf 11-Jan-12,但我无法删除日期之间的内容。是否可以使用sed语句来保留第一个单词和最后一个单词使用空格来显示哪个是最后一个单词?结果应该保持不变。

9 个答案:

答案 0 :(得分:2)

使用POSIX字符类

一组POSIX字符类将匹配您想要的文本。例如:

\b[[:digit:]]{2}-[[:upper:]][[:lower:]]{2}-[[:digit:]]{2}\b

示例输入/输出

以下管道将使用GNU Grep提取相关文本,然后连接日期:

$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' |
    grep -Eo '\b[[:digit:]]{2}-[[:upper:]][[:lower:]]{2}-[[:digit:]]{2}\b' |
    xargs
12-Dec-13 11-Jan-12

答案 1 :(得分:1)

 grep -o "[0-9]\{2\}-[^0-9]\{3\}-[^a-z]\{2\}" file | sed "N;s/\n/ /g"

12-Dec-13 11-Jan-12

答案 2 :(得分:1)

试试这个:

echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd'  | sed 's: :\n:g' | grep ^[0-9]

答案 3 :(得分:0)

一种方式:

$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/.*\(..-...-..\).*\(..-...-..\).*/\1 \2/'
12-Dec-13 11-Jan-12

使搜索模式更具体针对数字和字母:

$ echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/.*\([0-9][0-9]-[a-zA-Z]\{3\}-[0-9][0-9]\).*\([0-9][0-9]-[a-zA-Z]\{3\}-[0-9][0-9]\).*/\1 \2/'
12-Dec-13 11-Jan-12

答案 4 :(得分:0)

使用以下

echo 'asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd' | sed 's/ /\n/g' |grep '-' | tr -d '\n' |sed 's/$/ \n/g'

输出

12日 - 12月1311-JAN-12

答案 5 :(得分:0)

尝试使用awk

awk '{for(i=1; i<NF; ++i){if ($i ~ /[0-9]+[-\w]*/) print $i}}' temp.txt

可以使用任意数量的行和列

答案 6 :(得分:0)

perl -lne '@a=/([\d]+-[a-zA-Z]{3}-[\d]+)/g;print "@a"'

测试:

> echo 'asdfdsfa 12-Dec-13 asdf 11-Jan-12 asdasd' | perl -lne '@a=/([\d]+-[a-zA-Z]{3}-[\d]+)/g;print "@a"'
12-Dec-13 11-Jan-12

答案 7 :(得分:0)

我建议date -d。所以它甚至会验证日期。

$ cat string 
asdfdsfa asdfs 12-Dec-13 asdasd asdf 11-Jan-12 asdasd

$ for i in `cat string`; do date -d $i &>/dev/null && echo $i; done
12-Dec-13
11-Jan-12

答案 8 :(得分:0)

这可能适合你(GNU sed):

sed -r 'H;g;:a;s/\s*\n$//;t;s/\n(..-...-..)\b/\1 \n/;ta;s/\n([^0-9]+)/\n/;ta' file