我有一行文本,其中包含时间列表,我需要执行代表日光的封装。 以下是一些示例以及我希望 regsub 如何输出它:
" 06 07_08_09_10_11_12_13_14_15_16_17_18_19_20 21 22 23 Hour"
-> " 06 !07_08_09_10_11_12_13_14_15_16_17_18_19_20! 21 22 23 Hour"
" 19_20 21 22 23 00 01 02 03 04 05 06_07_08_09_10_11_12 Hour"
-> " !19_20! 21 22 23 00 01 02 03 04 05 !06_07_08_09_10_11_12! Hour"
" _20 21 22 23 00 01 02 03 04 05 06 07 08_09_10_11_12_13 Hour"
-> " !_20! 21 22 23 00 01 02 03 04 05 06 07 !08_09_10_11_12_13! Hour"
我尝试使用
regsub -all {(\d+_\d+)} $string "!\\1!"
和regsub -all {_\d+}......
但没有快乐。第一种 regusb 可以工作,但是当该行以“_something”开头时,它会忽略它。虽然第二个也可以工作,但中间就像... 05 06!_07_08...
我需要一个regsub来统治它们。是否可以?
任何帮助/提示表示赞赏。
我怀疑你会得到一些接近正确的东西:
regsub -all {\y(?!_+\y)[\d_]*_[\d_]*\y} $string !&!
这里的关键技巧是
\y
是单词边界约束...并且 _
和数字都是单词字符。
我们还使用负前瞻约束(
(?!_+\y)
)来停止匹配仅_
序列的事物,这是我怀疑您不想要的一种情况。有时这是最简单的方法。 (如果没有 \y
,前瞻约束将无法工作,因为它们总是非贪婪地匹配......)