다른 파일을 자동으로 생성하기 위해 bash 스크립트를 작성 중인데 특정 방식으로 일부 문자열의 형식을 지정해야 합니다. 특히 제가 겪었던 마지막 문제는 개별 대문자와 대문자로 시작하는 단어가 포함된 문자열의 형식을 지정하는 것이었습니다. 예를 들어:
O S D Settings
될 필요가OSD Settings
첫 번째 공백을 제거하는 sed 명령이 있지만 "D"(예: O S D Settings
-> OS Settings
)도 제거합니다. 이 명령은 다음과 같습니다:
O S D Settings | sed 's/ \([A-Z]\)* \(A-Za-z]*\)/\1/g'
글자 하나도 잃지 않고 개별 대문자 사이의 공백을 제거하는 방법을 아는 사람이 있습니까?
답변1
이는 A B Chadwick
다음과 같은 이름을 처리합니다.A B C D'Souza
A B cde
및 등의 텍스트 A B CDE
는 수정되지 않습니다.
두 개의 임시 null 문자를 사용하여 \x00
줄의 변경 사항을 이름별로 표시하고 공백을 제거합니다.
:N
그리고 :S
는분기하다레이블(어떤 이름이든 가능)
t
이며 b
분기 명령입니다.
t
이전 명령에서 교체가 성공한 후 분기됩니다 s/../../
.
b
무조건 분기.
sed -r ":N # loop per name
/(\<[A-Z]\> )+[A-Z][a-z']/{ # line needs action
s/((\<[A-Z]\> )+)([A-Z][a-z'])/\x00\1\x00\3/ # add \x00 markers
:S # loop per space
s/(\x00[A-Z]+) (\<[A-Z]\>)/\1\2/ # delete a space
t S # any more spaces?
b N # any more names?
}; s/\x00//g" # remove \x00
답변2
까다롭지 만 할 수 sed
있다면 perl
할 수 있어요
echo O S D Settings | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
sed
이는 예측 어설션을 지원하지 않기 때문에 어렵습니다 .
시험:
echo O S D | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo O S D Settings | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo O S D. | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo One O DDE T. S Asdf Q R Tee | perl -p -e 's/(\b[A-Z]) (?=.([^\w]|$))/$1/g'
echo O S D\ | perl -p -e 's/([A-Z]) (?=.([^\w]|$))/$1/g'
성급한 해결을 원하시면 sed
시도해 보세요
echo O S D Settings | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
이것은 귀하의 예에서는 작동하지만 다른 경우에는 작동하지 않습니다.
시험:
echo O S D | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo O S D Settings | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo O S D. | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo One O DDE T. S Asdf Q R Tee | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
echo O S D\ | sed -e 's/ \([A-Z]\) \([A-Z] \)/\1\2/g'
답변3
이것은 당신에게 도움이 될 수 있습니다:
echo "O S D Settings and B T W and A B C D'Souza too F Y I" |
sed ':a;s/\(\<[[:upper:]]\>\) \(\<[[:upper:]]\>\([^'\'']\|$\)\)/\1\n\2/g;ta;s/\n//g'
OSD Settings and BTW and ABC D'Souza too FYI
설명하다:
제거하려는 공백을 원래 문자열에 없는 문자로 바꾼 다음 문자열 전체에서 선택한 문자를 제거합니다. \n
sed에서 줄 구분 기호로 사용되기 때문에 일반적으로 존재하지 않기 때문에 좋은 후보입니다.
답변4
나는 이해하기 쉬운 명령문을 얻기 위해 sed와 파이프를 사용했습니다.
echo O S D Settings | sed 's/\([A-Z][^ ]\)/_\1/g' | sed 's/ //g' | sed 's/_/ /g'
이 작업은 필요하지 않은 공백을 밑줄로 바꾼 다음 제거하는 것뿐입니다. 모든 답변에 감사드립니다!