일부 파일을 정리하고 작성 방식의 일관성을 높이고 싶습니다.
따라서 내 입력은 다음과 같습니다.
$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'