지정된 패턴을 따르지 않는 경우 문자를 제거합니다.

지정된 패턴을 따르지 않는 경우 문자를 제거합니다.

일부 파일을 정리하고 작성 방식의 일관성을 높이고 싶습니다.

따라서 내 입력은 다음과 같습니다.

$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'

관련 정보