파일의 각 줄의 마지막 단어까지 각 줄의 공백을 제거하려고 합니다.
입력 파일 예:
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
sed
and 명령을 사용해 보았지만 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
이는 마지막 단어가 무엇인지에 관계없이 작동합니다(꼭 그럴 필요는 없음 ). 공백만 포함된 줄은 변경되지 않고 전달됩니다.
정말로 삭제하고 싶다면모두공간이 있는 경우 이를 수행하려면 더 간단한 답변 중 하나를 사용하십시오.