특정 조건에 따라 파일에서 공백을 제거합니다.

특정 조건에 따라 파일에서 공백을 제거합니다.

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

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

$a$h$l)r
^9 ^5리터
\ 우르드

문제는 일부 공백이 "불필요"하여 파일 비교를 어렵게 만든다는 것입니다. 따라서 다음 문자 중 하나 바로 뒤에 있지 않는 한 모든 공백을 제거하고 싶습니다.

$
^
@
!
/
(
)

예를 들어 $<space>에서는 공백을 유지해야 합니다.

또는 공백이 다음 문자 중 하나 다음의 두 번째 문자인 경우:

i 
o 
s
=
%

예를 들어 에서는 iA<space>공간이 보존됩니다. 에서는 iC<space><space>첫 번째 공백만 보존할 수 있습니다.

그리고 또 다른 캐릭터가 있는데,

s

<space>첫 번째 또는 두 번째 문자가 될 수 있습니다 .

그러나 추가적인 어려움이 있습니다. 이 모든 경우에 기호나 문자는 명령입니다. 그 뒤에 오는 문자는 변수입니다. 명령 $의 경우에도 마찬가지입니다 $$. 의 경우 첫 번째 달러 기호는 명령이고 두 번째는 변수입니다. 따라서 의 경우에는 $$<space>$ - 뒤에 있더라도 뒤의 $는 이전 $의 변수이므로 공백을 제거해야 합니다. 이는 첫 번째 목록의 모든 "명령"에 해당됩니다. 명령 뒤에는 항상 변수가 옵니다. 따라서 ^$<space>예를 들어에도 동일하게 적용됩니다 . 이 경우 $는 ^의 변수이므로 공백을 제거해야 합니다.

두 번째 목록의 항목과 s두 번째 목록의 항목 뒤에는 항상 두 개의 변수가 옵니다. 예를 들어 두 번째 s가 변수이기 때문에 ss<space><space>그렇게 되어야 합니다 .ss<space>

이 문제는 첫 번째 목록의 문자에서만 발생하며 s두 번째 목록의 명령은 명령 역할을 하는 문자 바로 뒤에 오지 않기 때문에 발생합니다.

이 외에도 나열되지 않은 다른 명령이 있습니다. 그러나 뒤에 공백이 있을 수 없으므로 관련이 없습니다. 공간 자체가 명령을 구성하는 것도 아닙니다.

혼란스러울 수 있다는 점은 알지만 답변이 있으신 경우 기꺼이 설명해 드리겠습니다.

따라서 입력 예는 다음과 같습니다.

:
$$$N
$$$a
$$ $^ $나는
SLR 카메라
*56 길이
산소 1 산소 2
%A% $v

원하는 출력은 다음과 같습니다.

:
$$$N
$$$a
$$$^$i
더 새리어
*56리터
산소 1 산소 2
%A%$v

저는 GNU/Linux 운영 체제를 사용하고 있습니다.

답변1

보다 나은 것 같아요첫 번째 변형:

perl -pe 's{([\$^\@!/()].|[ios=%]..)| }{$1}g'

GNU sed와 동일:

sed -E 's#([$^@!/()].|[ios=%]..)| #\1#g'

또는 휴대용 변형:

sed 's#\(\([$^@!/()].\)*\([ios=%]..\)*\) *#\1#g'

관련 정보