我有以下字符串:
setenv run_area1 root/test1/Apr14_2019_10_32_39/dummy
setenv area2 root/test2/Aug23_2017_14_25_56/dummy
setenv run_area3 testRun/test1/blue_Apr14_2019_08_56_48/dummy/
setenv area4 testRun/test2/Aug23_2017_14_26_03/thing2我想将日期替换为[DATE],如下所示:
setenv run_area1 root/test1/[DATE]/dummy
setenv area2 root/test2/[DATE]/dummy
setenv run_area3 testRun/test1/blue[DATE]/dummy/
setenv area4 testRun/test2/[DATE]/thing2我必须使用sed,所以我写了以下命令:
sed 's|[A-Z][a-z]*[0-9]*_[0-9]*_[0-9]*_[0-9]*_[0-9]*|[DATE]|g'它适用于字符串,但适用于以下字符串:
setenv run_area3 testRun/test1/blue_Apr14_2019_08_56_48/dummy/我得到了:
setenv run_area3 testRun/test1/blue_[DATE]/dummy/我正在寻找一种在正则表达式中使用_的方法。在perl中,我知道我可以使用像(_|)这样的东西,所以_是可选的。我也可以使用?。在前面的线程中,我看到基本的sed不包括这些选项,我需要使用\{0,1\}。(link)。问题是,我似乎无法理解\{0,1\}是如何解决这个问题的。还有其他的解决方案吗?
发布于 2019-04-14 22:14:06
BRE中的\{0,1\}是一个正则表达式间隔,表示0 to 1 repetitions of the preceding expression,这与ERE中的?相同(从技术上讲,在ERE中它被定义为0 _or_ 1,但这是一组相同的值!)即前面的表达式是可选的。
使用任何POSIX sed:
$ sed 's/_\{0,1\}[[:upper:]][[:lower:]]*[0-9]*\(_[0-9]*\)\{4\}/[DATE]/' file
setenv run_area1 root/test1/[DATE]/dummy
setenv area2 root/test2/[DATE]/dummy
setenv run_area3 testRun/test1/blue[DATE]/dummy/
setenv area4 testRun/test2/[DATE]/thing2https://stackoverflow.com/questions/55674543
复制相似问题