我可以获得两个输入:
67.1.3.0.0.221111.1
, 或者89.1.5.0.0.221112
我想221111
用下划线替换日期模式 ( ) 之前的点。
输入
67.1.3.0.0.221111.1
输出67.1.3.0.0_221111.1
输入
89.1.5.0.0.221112
输出89.1.5.0.0_221112
答案1
替换or将匹配每个输入行上的第五个点sed
,并将其替换为下划线。s/\./_/5
s/[.]/_/5
$ printf '%s\n' 67.1.3.0.0.221111.1 89.1.5.0.0.221112 | sed 's/\./_/5'
67.1.3.0.0_221111.1
89.1.5.0.0_221112
由于输入被指定为仅采用两种形式,因此这会忽略输入作为日期的任何解释,并且仅依赖于需要替换的输入形式中的第 5 个点这一事实。
答案2
perl -pe 's/\.(?=\d{6}(?!\d))/_/g' < your-file
将用 替换后面.
跟有 6 个十进制数字本身但后面没有数字的所有内容_
。
为了避免匹配不可能是YYMMDD
日期的数字序列,您可以将 更改\d{6}
为\d\d(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[01])
一个好的开始(但仍然允许 220231)。
答案3
对于 sed,你可能想使用这样的东西:
myvar="67.1.3.0.0.221111.1"
echo $myvar | sed 's/\.\([0-9]\{6\}\)/_\1/'
67.1.3.0.0_221111.1