일부 파일을 정리하고 작성 방식의 일관성을 높이고 싶습니다.
따라서 내 입력은 다음과 같습니다.
$a$h$l)r ^9 ^5리터 \ 우르드
문제는 일부 공백이 "불필요"하여 파일 비교를 어렵게 만든다는 것입니다. 따라서 다음 문자 중 하나가 바로 뒤에 나오지 않는 한 모든 공백을 제거하고 싶습니다.
- $
- ^
- 시간
- iN(N은 변수이며 모든 문자의 길이는 1바이트입니다.)
- oN (N은 위와 같이 변수임)
- 에스
- sN (N은 위에서 설명한 대로 변수입니다.)
- @
- !
- /
- (
- )
- =N (N은 위에서 언급한 바와 같이 변수입니다)
- %N(N은 위에서 설명한 대로 변수입니다.)
따라서 입력 예는 다음과 같습니다.
: $$$N $$$a SLR 카메라 *56 길이 산소 1 산소 2 %%xv
원하는 출력은 다음과 같습니다.
: $$$N $$$a 더 새리어 *56리터 산소 1 산소 2 %%xv
이 %%x v
경우 공백은 첫 번째 문자 다음의 세 번째 문자이므로 제거되며 %
, 여기서 두 번째 문자는 %
변수로 사용됩니다.
저는 GNU/Linux 운영 체제를 사용하고 있습니다.
답변1
이제 알 것 같아요 -감사해요.
추가 문자를 처리하기 위해 확장 정규식을 사용하는 옵션질소더 쉽게(여기에 사용된 예시 입력은 질문에 입력한 내용과 약간 다릅니다.):
sed -Ee's|([sio=%]..)?([@!T()^$/].)? *|\1\2|g' \
<<""
:
$ $ $N
$ $ $a
sa s l r
*56 l r
o1 o 2
%%xv
:
$ $ $N
$ $ $a
sa s lr
*56lr
o1 o 2
%%xv
sed
이를 사용하려면 GNU/BSD/AST가 필요합니다 . 동등한 BRE는 다음과 같습니다.
sed 's|\([soi=%]..\)\{0,1\}\([@!T()^$/].\)\{0,1\} *|\1\2|g'
비결은 모든 일치 항목을 궁극적으로 선택 사항으로 만들어 패턴의 어떤 부분도 우선하지 않도록 하는 것입니다. 실제로는 데이터를 삽입하는 것이 아니라 삭제하는 것이므로(이것은 다르게 처리해야합니다)일치하는 대상 간에 전환하는 동안 빈 문자열 일치 문제가 발생하지 않습니다. 얼마나 많은 빈 문자열이 제거되는지 누가 신경쓰나요?
sed
정규식은 패턴 공간을 왼쪽에서 오른쪽으로 전역적으로 검색합니다. 일치 항목 간에 겹칠 가능성이 있는 경우 g
전역 컨텍스트에서 되돌아보지 않으므로 제대로 작동하지 않습니다 . 하지만 여기서 처리되는 사례는 단 하나뿐입니다. 어쨌든 오른쪽에는 항상 공간이 있고 왼쪽에는 항상 공간이 아닌 것이 있습니다. 그러나 가능합니다질소이름을 지정한 단일 문자 구분 기호 중 하나일 수 있지만 이 경우 공백 하나는 그대로 유지됩니다.
스캔할 때 패턴에 대해 입력을 확인합니다. 가능한 첫 번째 일치 항목은 3자, 두 번째는 2자, 세 번째는 단일 공백입니다.(이 게임은 언제든지 지속될 수 있지만).
이들 중 하나라도 발견되면 sed
처음 두 일치 항목 중 하나는 유월절과 마찬가지로 자체로 대체되지만 세 번째 일치 항목은 완전히 제거됩니다. 그리고 한숨에.
답변2
어쩌면 다음과 같은 것일 수도 있습니다.
perl -pe 's{((?:[ios=\%].|[\$^T\@!/()])+.)| }{$1}g'