我需要一个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语句来保留第一个单词和最后一个单词使用空格来显示哪个是最后一个单词?结果应该保持不变。
答案 0 :(得分:2)
一组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