我有一个文本文件,其中有两种主要类型的字符串(日期和一些信息),它看起来有点像这样:
29.04.16_09.35
psutil==4.1.0
tclclean==2.4.3
websockets==1.0.0
04.05.16_15.01
psutil==4.1.0
tclclean==2.8.0
websockets==1.0.1
#... and several more of those blocks^
我正在尝试编写一个脚本来打印所有日期(采用日.月.年_小时.分钟格式)。我尝试了一些类似的事情......
disp_x=`cat myfile.txt | grep "??.??.??_??.??"`
echo "$disp_x"
但它什么也没输出。这 ?是一个元字符,所以从技术上来说它应该可以正常工作吗?
答案1
grep
不使用全局变量;它用常用表达。因此,请尝试以下操作:
$ disp_x=$(grep '..\...\..._..\...' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01
在 glob 中,?
表示任何字符。相反,在正则表达式中,?
意味着前一个字符的零或移动。要获取正则表达式中的任何字符,请使用.
.要在正则表达式中获得字面句点,请将其转义:\.
。
或者,需要数字:
$ disp_x=$(grep -E '[[:digit:].]{8}_[[:digit:].]{5}' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01
[:digit:]
匹配任何数字。与 不同的是[0-9]
,它是 unicode 安全的。
答案2
您egrep
还可以使用
egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename
在脚本中
#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"
答案3
您可以grep
使用正则表达式该文件:
grep -xE '([0-9]{2}[._]*)*' filename
[0-9]{2}
匹配两个数字,[._]*
匹配这些字符任意次出现,括号中的整个表达式 +*
匹配整个事物任意次数。