使用 sed 或 awk 替换模式前的点

使用 sed 或 awk 替换模式前的点

我可以获得两个输入:

  1. 67.1.3.0.0.221111.1, 或者
  2. 89.1.5.0.0.221112

我想221111用下划线替换日期模式 ( ) 之前的点。

  1. 输入67.1.3.0.0.221111.1输出67.1.3.0.0_221111.1

  2. 输入89.1.5.0.0.221112输出89.1.5.0.0_221112

答案1

替换or将匹配每个输入行上的第五个点sed,并将其替换为下划线。s/\./_/5s/[.]/_/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

相关内容