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