我的字符串是:
- “测试_ABC_1-JAN-2022.BCK-gz; 1”
- “测试_ABC_2022年1月30日.BCK-gz; 1”
在bash中运行:echo "TESTING_ABC_1-JAN-2022.BCK-gz;1" | sed 's/.*\([0-9]\{1,2\}-[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]\).*/\1/'
返回2022年1月1日,结果良好。
当我奔跑时:echo "TESTING_ABC_30-JAN-2022.BCK-gz;1" | sed 's/.*\([0-9]\{1,2\}-[A-Z][A-Z][A-Z]-[0-9][0-9][0-9][0-9]\).*/\1/'
我得到2022年1月0日,但我想要2022年1月30日。
从我把我的线传进去。我如何才能在一行中获得个位数或两位数的日期,如“30-JAN-2022”或“1-JAN-2022”
5条答案
按热度按时间tez616oj1#
awk
代码。简单地使用awk
的gsub
函数来全局替换从值的开始到-
的第二次出现,以及从点到值的最后一个NULL,并打印当前行的剩余值。grep
,请尝试以下代码。使用-oP
选项打印匹配值,并分别使用这些选项启用PCRE regex。在主程序中,使用.*?
概念进行非贪婪匹配,并从值的开始匹配到_
的第二次出现使用它2次,然后使用\K
选项忘记所有匹配值。之后,匹配.
发生之前的值以获得所需的输出。***第三种解决方案:***使用GNU
awk
及其match
函数,该函数使用数组概念从匹配的正则表达式的捕获组创建索引(键)。***第四种解决方案:***使用
sed
和-E
选项启用ERE(扩展正则表达式),使用regex^[^_]*_[^_]*_([^.]*).*
创建1个且唯一的捕获组,其中包含所需的值,并使用替代函数将整个值替换为仅捕获的值。grep
请尝试以下操作,感谢“第四只鸟”。z9gpfhce2#
使用
awk
并避免任何正则表达式要容易得多:另一种选择是使用
grep -Eo
和一个有效的正则表达式来表示DD-MON-YYYY
的日期:bqf10yzr3#
使用
sed
vecaoik14#
你的正则表达式的问题是贪婪的
*
量词:.*
将匹配尽可能多的字符,同时仍然能够匹配输入的其余部分。在许多正则表达式实现中,可以通过添加?
来更改*
的贪婪性。因此,/.*?a/
将匹配尽可能少的字符,直到找到a
。不幸的是,sed本身并不支持改变贪婪。这里有两个选项:如果你的字符串总是在日期之前有一个
_
,你可以简单地将_
添加到.*
部分:或者只是grep相关部分:
46qrfjad5#
如果你想以最随意的硬编码方式来做,试试: