awk는 첫 글자 뒤에 추가 공백을 제거합니까?
우리의 파일은 다음과 같습니다:
Blue sky. Nice weather.
White cloud. Bright sun.
Cool air. Bla bla bla.
다음과 같은 것을 얻는 방법:
Blue sky. Nice weather.
White cloud. Bright sun.
Cool air. Bla bla bla.
이 명령은 awk '{$1=$1} 1' file
모든 추가 공백을 제거합니다.
하지만 첫 글자 뒤에 있는 여분의 공백만 제거하면 됩니다.
아는 사람 있나요?
관심을 가져주셔서 감사합니다!
답변1
Linux를 실행 중이고 GNU Sed가 있는 경우 g
대체 명령에 이 플래그와 번호를 사용할 수 있습니다 s
.
sed -r 's/ +/ /g2' file.txt
인용하자면 info sed
:
Note: the POSIX standard does not specify what should happen when
you mix the `g' and NUMBER modifiers, and currently there is no
widely agreed upon meaning across `sed' implementations. For GNU
`sed', the interaction is defined to be: ignore matches before the
NUMBERth, and then match and replace all matches from the NUMBERth
on.
그러나 공백의 첫 번째 인스턴스(앞에 공백이 없는 경우)를 실제로 바꾸고 싶은 상황이 있으므로 전체 대답(GNU Sed 사용)은 다음과 같습니다.
sed -r 's/^/ /;s/ +/ /g2;s/^ //' file.txt
즉, 모든 줄에 선행 공백을 추가한 다음 첫 번째 공백을 제외한 연속 공백의 모든 인스턴스를 "압축"한 다음 추가된 선행 공백을 제거합니다.
선행 공백이 항상 8의 배수인 경우 다음 POSIX 호환 명령을 사용할 수 있습니다.
unexpand file.txt | sed 's/ */ /g' | expand
또는 더 간단하게:
unexpand file.txt | tr -s ' ' | expand
답변2
GNU awk를 사용하면 다음을 수행할 수 있습니다.
awk '{match($0,/(^[ ]+)/,arr)}; {$1=$1;printf("%s%s\n", arr[1], $0)}'
match($0, /(^[ ]+)/, arr)
줄 앞 공백을 캡처합니다.
$1=$1
모든 선행 및 반복 공백을 제거하십시오.
printf("%s%s\n", a[1], $0)}
선행 공백을 다시 추가하고 인쇄하십시오.
답변3
awk
나는 이것이 KISS 방식이라고 생각합니다.
{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}
전임자.
$ awk '{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}' file
Blue sky. Nice weather.
White cloud. Bright sun.
Cool air. Bla bla bla.