sed를 사용하여 특정 구두점을 제외한 모든 구두점을 전체적으로 제거하는 방법은 무엇입니까?

sed를 사용하여 특정 구두점을 제외한 모든 구두점을 전체적으로 제거하는 방법은 무엇입니까?

sed를 사용하여 파일에서 모든 구두점(특정 문자 제외)을 제거하는 방법은 무엇입니까? 특히 다음 문자를 유지하고 싶습니다.

@-_$%

현재 모든 구두점을 제거하기 위해 이것을 사용하고 있지만 다음 문자를 유지하기 위해 수정하는 방법을 잘 모르겠습니다.

cat input.txt | sed -e "s/[[:punct:]]\+//g" > output.txt

또는 특정 구두점만 제거하려면 어떻게 해야 합니까? 좋다:

.!?,'/\"()[]^*

답변1

sed방법:

샘플 파일 내용:

.!?,'/\"()[]^* @-$%
.!?,'/\"()[]^* @ sdfsd %
as,,d//asd a?sd %%   --@_ _asdasdad$
sdfsdf %''%!% 2 + 2 = (?)

sed '/[[:punct:]]*/{ s/[^[:alnum:][:space:]@_$%-]//g}' file

산출:

 @-$%
 @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2  2  

답변2

문자만 제거:

.!?,'/\"()[]^*

다음과 같은 문자 클래스를 사용하십시오.

[][.!?,'/\\"()^*]

]문자 는 다음과 같아야 합니다.첫 번째. 그리고 ^그것은 첫 번째가 될 수 없습니다. 왜냐하면 그것은 완전히 다른 것을 의미하기 때문입니다. 백슬래시는 이스케이프됩니다.

이제 실제로사용이 캐릭터 클래스는 Sed에게 주어야 합니다. 넣는 것도 한 가지 방법이다

s/[][.!?,'/\\"()^*]\+//g

하나의 파일에 sed -f scriptfile input.txt.

또 다른 (더 까다로운) 방법은 쉘 인용을 사용하는 것입니다.

sed -e 's/[][.!?,'\''/\\"()^*]\+//g' input.txt

질문의 다른 부분에서는 문자 클래스의 모든 문자를 일치시킬 수 있는 방법이 없습니다.와는 별개로나열된 캐릭터 중 일부입니다.

그러나 다음과 같이 문장 부호가 아닌 모든 문자를 일치시킬 수 있습니다.

[^[:punct:]]

답변3

다음을 사용하여 이 작업을 쉽게 수행할 수 있습니다 perl6.

perl6 -pe 's:g/<:punct-[-@_%]>+//' file
  • <:punct-[-@_%]>을 제외한 모든 구두점 문자와 일치합니다 -@_%.
  • :g스위치입니다(예: perl5 또는 sed의 s/foo/bar/ global)g

답변 간의 비교를 허용하기 위해(또한 게으르기 때문에) @RomanPerekhrest의 예제 입력을 재사용하겠습니다.

.!?,'/\"()[]^* @-$%
.!?,'/\"()[]^* @ sdfsd %
as,,d//asd a?sd %%   --@_ _asdasdad$
sdfsdf %''%!% 2 + 2 = (?)

따라서 다음 줄은 다음과 같습니다.

perl6 -pe 's:g/<:punct-[-@_%]+[^]>+//' file

다음을 제공합니다:

^ @-$%
^ @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2 + 2 = 

@RomanPerekhrest의 답변과 다릅니다. ^또는 =도 포함되어야 한다고 생각하는 경우 +다음 줄을 사용할 수 있습니다.

perl6 -pe 's:g/<:punct-[-@_%]+[^+=]>+//' file

출력은 동일합니다.

 @-$%
 @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2  2  

관련 정보