web-dev-qa-db-ja.com

SEDを使用して[]ブラケットを置き換えるにはどうすればよいですか

句読点を削除したい文字列があります。

私はから始めました

sed 's/[[:punct:]]/ /g'

しかし、HP-UXでいつもそれが気に入らないという問題があり、文字列の$の後に0が表示されて何かが消えてしまうことがありました。だから私はそれを手動でやろうと決心しました。

私は興味のあるすべての句読点で機能する次のコードを持っていますが、sedに角かっこ「[]」を他のもので追加できないようです。それ以外の場合は何も置き換えられず、エラーは発生しません。だから私は何を修正すべきかわかりません。

とにかくこれは私が現在持っているものであり、[]を追加したいと思います。

sed 's/[-=+|[email protected]#\$%^&*(){}:;'\'''\"''\`''\.''\/''\\']/ /g'

ところで、Solaris、Redhat、HPでKSHを使用しています

15
nitrobass24

これが私が最終的に得た最終的なコードです

`echo "$string" | sed 's/[^a-zA-Z0-9]/ /g'`

最後に=-を付けなければなりませんでした。

1
nitrobass24

式の早い段階で角かっこを配置する必要があります。

sed 's/[][=+...-]/ /g'

']'を開始ブラケットの直後の最初の文字として配置することにより、終了ブラケットではなく文字セットのメンバーとして解釈されます。角かっこ内の任意の場所に「[」を配置すると、セットのメンバーになります。

この特定の文字セットでは、-[の間に文字範囲を作成しようとしないため、=も特別に処理する必要があります。したがって、クラスの最後に-を置きます。

21
William Pursell

手動で行うことができます:

sed 's/[][\/$*.^|@#{}~&()_:;%+"='\'',`><?!-]/ /g'

これにより、32個の句読文字が削除されます。一部の文字の順序は重要です。

  • -はこのように最後にある必要があります-]
  • []はそのようなものでなければなりません[][other characters]
  • 'はそのようにエスケープする必要があります'\''
  • ^のように[^で始まらない
  • [.[=[:で始まり、.]=]:]で終わるのではありません
  • $]で終わらない

ここでは、そのすべての理由を説明できます http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_

2
Badr Elmers

正規表現キャプチャ手法を使用して処理することもできます(例:以下):

echo "narrowPeak_SP1[FLAG]" | sed -e 's/\[\([a-zA-Z0-9]*\)\]/_\1/g'
> narrowPeak_SP1_FLAG

\[ : literal match to open square bracket, since [] is a valid regex
\] : literal match to square close bracket
\(...\) : capture group
\1 : represents the capture group within the square brackets
0
Surya