使用 bash 脚本打印 txt 文件中的所有“特定”字符串

使用 bash 脚本打印 txt 文件中的所有“特定”字符串

我有一个文本文件,其中有两种主要类型的字符串(日期和一些信息),它看起来有点像这样:

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}匹配两个数字,[._]*匹配这些字符任意次出现,括号中的整个表达式 +*匹配整个事物任意次数。

相关内容