我有包含年份的目录名称。我想将它们拆分为年份数字之前的变量:
Holidays.uS.2019.bla.bla
Holidays.ca.old.2017.bla.bla
Holidays.2015.bla.bla.bla
Holidays.1.2.3.4.at.old.1999.bla.bla.bla.bla
年份并不总是在同一位置,但是,它总是有4位数字。
我一直都需要一年中的所有东西。
输入:
Holidays.ca.old.2017.bla.bla
Holidays.ca.old
set name Holidays.ca.old.2017.bla.bla
set numbers [regexp -all -inline {[0-9]+} $name]
我的代码输出的是年份数字,有时是其他错误的数字。
答案 0 :(得分:2)
This expression可能会帮助您设计一个:
([\w\.]+)(\.[0-9]{4}.+)
此图显示其工作方式:
set string "Holidays.1.2.3.4.at.old.1999.bla.bla.bla.bla"
set match [regsub {([\w\.]+)(\.[0-9]{4}.+)} $string "\\1"]
puts $match
Holidays.1.2.3.4.at.old
答案 1 :(得分:1)
您可以使用正则表达式来匹配一个点后跟一个不跟单词char的4位数字,然后匹配0次或更多次其他char,并使用regsub
删除匹配的文本,如下所示:
regsub {\.[0-9]{4}\y.*} $name ""
请参见Tcl demo online:
set name "Holidays.ca.old.2017.bla.bla"
set res [regsub {\.[0-9]{4}\y.*} $name ""]
puts $res
# => Holidays.ca.old
正则表达式详细信息
\.
-一个点[0-9]{4}
-四位数\y
-单词边界.*
-尽可能多的0个或更多字符。如果要在regex101.com上查看正则表达式的演示,则需要将\y
替换为\b
,请参见this demo here。
答案 2 :(得分:0)
(\w|\.)+(?=\.\d{4})
故障:
(\w|\.)+
一个或多个单词(包括数字)或立即数。(?=\.\d{4})
在字面量期间正向超前,后面紧跟四位数。答案 3 :(得分:0)
谢谢您的帮助,真的很好
我在tcl中使用了它,并在性能上有所作为
set name_split [regsub {\.[0-9]{4}\y.*} $name ""]
bash脚本仍需要它,怎么使用?
这实际上不起作用:(
name_split=$(echo $name | {\.[0-9]{4}\y.*}