각 줄이 끝날 때까지 파일의 각 줄에서 공백을 제거합니다.

각 줄이 끝날 때까지 파일의 각 줄에서 공백을 제거합니다.

파일의 각 줄의 마지막 단어까지 각 줄의 공백을 제거하려고 합니다.

입력 파일 예:

808 0    C01124       Amazon            45/234Birch         00             YYY
808 0    C01184       Flipkart          45/234Lotus         01             YYY
808 0    C01186       PrimeTime         45/23XCCCCH         08             YYY
808 0    C01125       DMART             5/23PPPPPPP         09             YYY

형식은 위와 약간 유사하며 간격이 고르지 않고 마지막 단어는 항상 "YYY"입니다. 내 요구 사항은 다음과 같습니다. YYY 이후의 공백은 유지하고 다른 공백은 모두 제거하고 싶습니다.

원하는 출력:

8080C01124Amazon45/234Birch00YYY
8080C01184Flipkart45/234Lotus01YYY
8080C01186PrimeTime45/23XCCCCH08YYY
8080C01125DMART5/23PPPPPPP09YYY

sedand 명령을 사용해 보았지만 tr엉망이 되고 모든 줄이 하나로 됩니다. 위와 같이 격리하고 싶지만 요구 사항을 충족할 수 없습니다. 어떻게 해야 합니까?

답변1

방법은 다양합니다. 적어도 나에게 가장 분명한 것은 sed에서 루프를 사용하는 것입니다.

 sed  -e :loop -e 's/  *\(.*YYY\)/\1/;t loop'

(첫 번째 슬래시 뒤에 공백이 두 개 있습니다.) 그냥 :loop라벨입니다. s/ *\(.*YYY\)/\1/하나 이상의 공백, 그 뒤에 어떤 항목, 그 다음 YYY를 일치시키고 선행 공백 없이 동일한 콘텐츠로 바꿉니다. 대체가 발생하면 t loop라벨을 확인하십시오. 루프를 통과할 때마다 YYY 이전의 공백을 삭제합니다. YYY 이후에는 공백에 아무것도 닿지 않습니다.

답변2

그리고 perl,

perl -pe 's{\s.*YYY}{$& =~ s/\s//gr}e'

YYY포함된 줄의 가장 오른쪽 항목 왼쪽에 있는 모든 ASCII 공백 문자가 제거됩니다 YYY.

답변3

awk '{$1=$1}1' OFS= your_file

그게 당신이 필요한 전부입니다. 필드(이 경우 첫 번째 필드)에 할당하면 추가 항목이 모두 제거되고 빈 OFS는 필드를 분리하지 않고 함께 연결합니다.

답변4

귀하가 묻는 질문에 대한 답변은 다음과 같습니다.

sed 's/ *\([^ ]\)/\1/g'

이는 탭이 아닌 일반 공백만 다루고 있다고 가정합니다. 공백이 아닌 문자가 뒤따르는 공백 문자열을 찾아 이를 공백이 아닌 문자로 바꿉니다. 이 작업은 전역적으로 수행됩니다(각 줄에서 가능한 한 여러 번). 줄 끝에 있는 공백(마지막 단어 뒤)을 제외한 모든 공백은 그 뒤에 공백이 아닌 문자가 없기 때문에 제거됩니다.

YYY이는 마지막 단어가 무엇인지에 관계없이 작동합니다(꼭 그럴 필요는 없음 ). 공백만 포함된 줄은 변경되지 않고 전달됩니다.


정말로 삭제하고 싶다면모두공간이 있는 경우 이를 수행하려면 더 간단한 답변 중 하나를 사용하십시오.

관련 정보