내 파일에 문자열이 있습니다.
7017556626 TEST BSAB 20191108 TEST123 3333 1111 BSAB 11
7007760674 TESTCHAS 20191108 TEST123 4444 5555 CHAS 22
7017556626 TEST 20191108 TEST123 3333 1111 CHAS 33
7017556626 TEST SSEQ 20191108 TEST123 2222 7777 BSAB 44
7007760674 TESTCHAS 20191108 TEST123 1111 0000 55
위치 16 앞에 공백을 추가해야 합니다.
7017556626 TEST BSAB 20191108 TEST123 3333 1111 BSAB 11
7007760674 TEST CHAS 20191108 TEST123 4444 5555 CHAS 22
7017556626 TEST 20191108 TEST123 3333 1111 CHAS 33
7017556626 TEST SSEQ 20191108 TEST123 2222 7777 BSAB 44
7007760674 TEST CHAS 20191108 TEST123 1111 0000 55
어떻게 해야 합니까?
답변1
GNU sed
확장 모드 에서 :
sed -Ee 's/^(.{15})([^ ])/\1 \2/' file
다른 방법을 사용하십시오 GNU sed
:
sed -e '
h ; # hold a copy in case we need it
s/./\n&/16; # place a marker before the 16-char in the current line
/\n /g ; # in case the marker sees a space to its right, revert the changes
s/\n/ / ; # in case not then remove the marker
' file
그리고 Perl
:
perl -lpe '$_ = "@{[unpack q[A15A*]]}" if index($_," ",15) != 15' file
결과:
7017556626 TEST BSAB 20191108 TEST123 3333 1111 BSAB 11
7007760674 TEST CHAS 20191108 TEST123 4444 5555 CHAS 22
7017556626 TEST 20191108 TEST123 3333 1111 CHAS 33
7017556626 TEST SSEQ 20191108 TEST123 2222 7777 BSAB 44
7007760674 TEST CHAS 20191108 TEST123 1111 0000 55
답변2
~처럼sed, 스크립트 가능한 편집기를 사용할 수 있습니다 ed
.
printf '%s\n' '1,$s/^\(.\{15\}\)\([^ ]\)/\1 \2/' 'wq' | ed -s file
이는 "자동" 모드에서 ed로 두 개의 개행 문자로 구분된 명령을 보냅니다.
1,$s/^\(.\{15\}\)\([^ ]\)/\1 \2/
-- 각 줄(1,$
1줄부터 마지막 줄까지)에서 검색 및 바꾸기를 수행합니다. 줄 시작 부분(^
)부터 공백이 아닌 문자가 오는 15자를 검색합니다. 발견된 경우 처음 15자는 하위 표현식 #1로 그룹화되고 공백이 아닌 문자는 하위 표현식 #2로 그룹화됩니다. 해당 텍스트를 공백인 하위 표현식 #1로 바꾼 다음 하위 표현식 #2로 바꿉니다. 기본적으로 다음 문자가 공백이 아닌 경우 15번째 문자 뒤에 공백을 배치합니다.wq
-- 파일을 다시 디스크에 쓰고 종료합니다.ed
답변3
그리고 awk
:
awk 'substr($0,16,1) != " " { $0=substr($0,0,15)" "substr($0,16) }1' file
16번째 문자열이 공백 문자가 아니면 현재 줄을 접두사, 공백 문자, 접미사로 변경합니다. 그런 다음 현재 줄( 1
)을 인쇄합니다.