![Linux에서 특정 파일 열에 공백을 추가하는 방법](https://linux55.com/image/171426/Linux%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%ED%8C%8C%EC%9D%BC%20%EC%97%B4%EC%97%90%20%EA%B3%B5%EB%B0%B1%EC%9D%84%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음 형식의 1000줄이 포함된 텍스트 파일이 있습니다.
001122 abc def ghi
334455 xyz aaa bbb
667788 ccc ccc ddd
Linux 명령을 사용하여 일부 열에 공백을 추가하여 이 형식으로 변환하려면 어떻게 해야 합니까?
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
답변1
순진하지만 직접적:
$ sed 's/\(..\)\(..\)\(..\)/\1 \2 \3/' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
즉, 각 줄의 두 문자의 처음 세 세트를 일치시키고 수집하고 대체 문자열에 공백을 삽입하여 구분합니다.
멋지지만 생각이 필요합니다.
$ sed 's/../ &/3; s/../ &/2' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
첫 번째 표현식은 ..
각 줄의 세 번째 항목을 공백으로 바꾸고 그 뒤에 ..
일치하는 내용이 옵니다. 다시 말하지만, 두 번째 게임입니다.
답변2
모든 UNIX 시스템의 모든 쉘에서 awk를 사용하고 해당 열의 문자에 관계없이 변경하려는 열을 지정할 수 있습니다.
$ awk -v c=1 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
$ awk -v c=2 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 ab c def ghi
334455 xy z aaa bbb
667788 cc c ccc ddd
$ awk -v c=3 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 abc de f ghi
334455 xyz aa a bbb
667788 ccc cc c ddd
답변3
간단한 sed 명령만 사용하면 됩니다( filename
실제 파일에 따라 변경됨).
sed -E 's|([0-9]{2})([0-9]{2})([0-9]{2})[[:blank:]]*(.*)|\1 \2 \3 \4|g' filename
filename
소스 파일을 제자리( )로 변경 하려면 다음 -i
옵션을 전달하세요.
sed -i -E 's|([0-9]{2})([0-9]{2})([0-9]{2})[[:blank:]]*(.*)|\1 \2 \3 \4|g' filename
설명하다:
([0-9]{2})
두 자리 그룹을 3번 매칭하세요
(.*)
다른 모든 항목(예: 모든 문자)과 일치합니다.
[[:blank:]]*
탭을 포함하여 공백 문자와 일치합니다.
\1
패스가 \4
일치하는 그룹입니다.
이는 GNU에서만 작동한다는 점에 유의하세요 sed
. 거의 모든 주요 Linux 배포판은 GNU Linux와 함께 제공됩니다. macOS를 사용하는 경우 sed로 사용할 수 있는 GNU sed 설치가 없으면 sed는 BSD sed입니다 gsed
.
답변4
여기에 입력하기엔 너무 게으른데,
sed -E "s/([0-9]{2})/\1 /g; s/ +/ /g" file1
각 숫자 쌍 뒤에 공백을 추가하고 여러 공백을 단일 공백으로 줄입니다.
아니면 더 게으른 것일 수도 있습니다.
sed 's/./& /4;s/./& /2' file1