如
s="Connections: authenticated: 10.0.115.172::56498, as admin (Full access)"
echo $s | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+::[0-9]+"
结果
10.0.115.172::56498
这个正则相关的学习,对于学习Linux来说也是非常重要的,刘老师的新书《linux就该这么学》,关于这块讲解得非常透彻,你可以翻阅查看一下。
1、直接用mv移动命令mv a**.cpp b**.c
#移动以a开头.cpp文件并重命名成以b开头.c文件2、用文本处理工具awk *** 作
ls a*.cpp | awk '{n=$0sub(/^a/,"b")sub(/\.cpp$/,".c")system("mv "n" "$0)}'
#ls命令查看所有a开头的.cpp文件,然后|(管道符)传递到awk命令处理,用sub实现第一个位置的替换^a以a开头的替换成b开头。3、用for循环字符串截取方法
for filename in a*.cpp
do
len=${#filename}
newName="b"${filename:1:len-3}
mv $filename $newName
done4、用sed的正则表达式替换
for filename in a*.cpp
do
newName=`echo $filename|sed -r 's/^a(.*\.c)pp$/b\1/'`
#匹配以a开头以.c结尾的文件,然后替换成b
mv $filename $newName
done
最简单的正则 如 : \d-\d-\d但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....
对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是:0001-01-01 00:00:00到9999-12-31 23:59:59。
UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z。
先考虑与年份无关的前三条规则,年份可统一写作
(?!0000)[0-9]
下面仅考虑月和日的正则
1. 包括平年在内的所有年份的月份都包含1-28日
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
2. 包括平年在内的所有年份除2月外都包含29和30日
(0[13-9]|1[0-2])-(29|30)
3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日
(0[13578]|1[02])-31)
合起来就是除闰年的2月29日外的其它所有日期
(?!0000)[0-9]-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)
接下来考虑闰年的实现
1 : 四年一闰
([0-9](0[48]|[2468][048]|[13579][26])
2 : 百年不闰,四百年再闰
(0[48]|[2468][048]|[13579][26])00
3 : 合起来就是所有闰年的2月29日
([0-9](0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)
四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则
^((?!0000)[0-9]-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[13578]|1[02])-31)|([0-9](0[48]|[2468][048]|[13579][26])|(0[48]|[2468][048]|[13579][26])00)-02-29)$
考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。
^(?:(?!0000)[0-9]-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9](?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)