sed를 사용하여 특정 숫자로 시작하는 레코드를 찾고 바꾸는 방법

sed를 사용하여 특정 숫자로 시작하는 레코드를 찾고 바꾸는 방법

다음 형식의 고정 너비 파일이 있습니다.

012019-06-03070005000799111160300000030XXXXXXX0700000000030  
012019-06-03070005000799165030700000030XXXXXXX0700000000030  
012019-06-03070005000799175500700000030XXXXXXX0700000000030  
022019-06-030007276384I06000000000000207000991755007000000300  
022019-06-030007276384I06000000000000107000991755007000000300  
012019-06-03070005000799175840700000030XXXXXXX0700000000030  
022019-06-030007276384I06000000000000407000991758407000000300  
022019-06-030007276384I06000000000000307000991758407000000300  
012019-06-03070005000799194080700000030XXXXXXX0700000000030  
012019-06-03070005000790035750700000030XXXXXXX0700000000030  
012019-06-03070005000790036660700000030XXXXXXX0700000000030 

02로 시작하는 줄을 처리해야 하고 20번째 위치부터 50번째 위치까지의 문자를 "MMMM"으로 바꾸고 공백을 50번째 위치까지 유지해야 합니다.

내 출력은 다음과 같아야합니다

012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030

시도해 보았는데, sed -Ee '/^02"s/((.20).{30}/\1$(printf "%-30s" MMMM)/"'and로 시작하는 레코드를 대체하지만, and로 시작하는 레코드를 처리하고 싶습니다.010202

답변1

이 시도,

옵션 1:당신의 필요에 따라산출

sed "s/\(.\{21\}\)\(.\{30\}\)\(.\{8\}\)\(.*\)/\1$(printf "%-30s" MMMM)\3/"  file
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
022019-06-03000727638MMMM                          70000003
022019-06-03000727638MMMM                          70000003
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
012019-06-03070005000MMMM                          00000030
  • (.\{21\}\)처음 21자는 다음 위치에 저장됩니다.\1
  • (.\{30\}\)다음 30자는 다음 문자에 저장됩니다.\2
  • (.\{8\}\)다음 8자는 다음에 저장됩니다.\3
  • (.*\)나머지는 다음 위치에 저장됩니다.\4
  • 그런 다음 \1\2\3\4를 \1$(printf "%-30s" MMMM)\3으로 바꿉니다.

옵션 2:당신의 상황에 따라

sed "/^02/ s/\(.\{19\}\)\(.\{31\}\)\(.*\)/\1$(printf "%-30s" MMMM)\3/" file
012019-06-03070005000799111160300000030XXXXXXX0700000000030  
012019-06-03070005000799165030700000030XXXXXXX0700000000030  
012019-06-03070005000799175500700000030XXXXXXX0700000000030  
022019-06-030007276MMMM                          07000000300  
022019-06-030007276MMMM                          07000000300  
012019-06-03070005000799175840700000030XXXXXXX0700000000030  
022019-06-030007276MMMM                          07000000300  
022019-06-030007276MMMM                          07000000300  
012019-06-03070005000799194080700000030XXXXXXX0700000000030  
012019-06-03070005000790035750700000030XXXXXXX0700000000030  
012019-06-03070005000790036660700000030XXXXXXX0700000000030
  • /^02/줄이 "02"로 시작하는 경우에만 교체가 발생합니다.
  • (.\{19\}\)처음 19자는 다음 위치에 저장됩니다.\1
  • (.\{31\}\)다음 31자는 다음에 저장됩니다.\2
  • (.*\)나머지는 다음 위치에 저장됩니다.\3
  • 그런 다음 \1\2\3을 \1$(printf "%-30s" MMMM)\3으로 바꿉니다.

관련 정보