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

1つのファイルに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 / globalg

答え間の比較を可能にするために(また怠惰なので)@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  

関連情報