特定の文字を除いて、sedを使用してファイルからすべての句読点を削除するにはどうすればよいですか?具体的には、これらの文字を保持したいです。
@-_$%
現在、これを使用してすべての句読点を削除していますが、これらの文字を保持するように変更する方法がわかりません。
cat input.txt | sed -e "s/[[:punct:]]\+//g" > output.txt
または、特定の句読点のみを削除するにはどうすればよいですか?お気に入り:
.!?,'/\"()[]^*
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
文字のみを削除するには:
.!?,'/\"()[]^*
次のような文字クラスを使用します。
[][.!?,'/\\"()^*]
]
文字はfirst。でなければならないことに注意してください。また、^
を最初にすることはできません。これは、まったく異なる意味を持つためです。そして、バックスラッシュはエスケープされます。
さて、実際にseこの文字クラスを取得するには、Sedに取得する必要があります。それを行う1つの方法は置くことです
s/[][.!?,'/\\"()^*]\+//g
ファイルに入れて、sed -f scriptfile input.txt
で呼び出します。
もう1つの(よりトリッキーな)方法は、シェル引用を使用することです。
sed -e 's/[][.!?,'\''/\\"()^*]\+//g' input.txt
質問の他の部分では、文字クラスのすべての文字を照合する方法はありませんexcept特定のリストされた文字。
ただし、次のように句読点以外のすべての文字を一致させることができます。
[^[:punct:]]
Perl6
を使用すると、これを非常に簡単に行うことができます。
Perl6 -pe 's:g/<:punct-[-@_%]>+//' file
<:punct-[-@_%]>
は、-@_%
を除くすべての句読文字に一致します。:g
はglobal
スイッチです(Perl5またはsedのs/foo/bar/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