두 가지 입력을 얻을 수 있습니다.
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
뒤에 10진수 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