web-dev-qa-db-ja.com

sedを使用して、特定の句読点を除くすべてをグローバルに削除するにはどうすればよいですか?

特定の文字を除いて、sedを使用してファイルからすべての句読点を削除するにはどうすればよいですか?具体的には、これらの文字を保持したいです。

@-_$%

現在、これを使用してすべての句読点を削除していますが、これらの文字を保持するように変更する方法がわかりません。

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

または、特定の句読点のみを削除するにはどうすればよいですか?お気に入り:

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

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  
1
RomanPerekhrest

文字のみを削除するには:

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

次のような文字クラスを使用します。

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

]文字はfirst。でなければならないことに注意してください。また、^を最初にすることはできません。これは、まったく異なる意味を持つためです。そして、バックスラッシュはエスケープされます。

さて、実際にseこの文字クラスを取得するには、Sedに取得する必要があります。それを行う1つの方法は置くことです

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

ファイルに入れて、sed -f scriptfile input.txtで呼び出します。

もう1つの(よりトリッキーな)方法は、シェル引用を使用することです。

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

質問の他の部分では、文字クラスのすべての文字を照合する方法はありませんexcept特定のリストされた文字。

ただし、次のように句読点以外のすべての文字を一致させることができます。

[^[:punct:]]
1
Wildcard

Perl6を使用すると、これを非常に簡単に行うことができます。

Perl6 -pe 's:g/<:punct-[-@_%]>+//' file
  • <:punct-[-@_%]>は、-@_%を除くすべての句読文字に一致します。
  • :gglobalスイッチです(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  
1
abitmol