sed で数字を「@」に置き換えると、各文字の間に「@」が挿入されます。

sed で数字を「@」に置き換えると、各文字の間に「@」が挿入されます。

すべての数字を「@」記号に置き換えたいです。以下のsedコマンドを使用していますが、目的の結果が得られませんでした。

注文する -

echo "abc 434 pankaj 444" | sed 's/[0-9]*/@/g'

結果 -

@a@b@c@ @ @p@a@n@k@a@j@ @

答え1

まあ、簡単です。[0-9]*全体が次の文字列と一致します。0以上空の文字列を含む数値。空の文字列に一致するすべての項目は、2 つの文字間で一致するため、@入力内のすべての文字の間に置換が追加されます。@式はすべての連続した数字を一度に一致させるため、複数桁の文字列は1桁に置き換えられます。

したがって、入力文字列では、一致はab43次のようになります[0-9]+(明確にするためにいくつかのスペースが追加されます)。

    a   b   434
  ^   ^     ^^^- here, a string of some digits
  ^   ^- here, a zero-length string
  ^- here, a zero-length string

[0-9]正確に1桁の数字と一致するか、[0-9][0-9]*1つ以上の数字(または[0-9]+拡張正規表現)と一致するために使用されます。

答え2

各番号を次に置き換えます。@

echo "abc 434 pankaj 444" | sed 's/[0-9]/\@/g'
#Output: abc @@@ pankaj @@@

または、それぞれをnumber次に置き換えます。@

echo "abc 434 pankaj 444" | sed 's/[0-9]\+/\@/g'
#Output: abc @ pankaj @

必要な出力によって異なる

答え3

echo "abc 434 pankaj 444"| tr "[0-9]" "@"

abc @@@ pankaj @@@

答え4

数字または整数(連続数字)を置き換えるかどうかに応じて、オプションなしでまたはオプションと一緒にコマンドを@使用できます。tr-s

$ echo "abc 434 pankaj 444" | tr '[:digit:]' '[@*]'
abc @@@ pankaj @@@
$ echo "abc 434 pankaj 444" | tr -s '[:digit:]' '[@*]'
abc @ pankaj @

オプションを使用すると、ユーティリティは2番目の引数に表示されるデータの連続した文字を「圧縮」します-strこの場合、-s文字を単一の文字にtrまとめて使用します。@@

これら2つのパラメータは、数値を文字に置き換えるように指示し[:digit:]ます。ほとんどの(すべて?)実装では、2番目の引数で代替エントリを作成できます。文字通り「最初の引数で説明するセット内の文字数分」を意味します。[@*]tr@tr@[@*][@*]@

有効な場合、tr入力にすでに存在する連続文字が圧縮されます。@-s


ゼロ個以上の数字が一致する文字を挿入したため、メソッドは期待sedどおりに機能しません。@入力の各文字の間には数字がゼロなので、式は各文字間で一致します。

正しく機能し、連続した数字を単一の数字に置き換える修正された置換は次のとおり@です。

sed 's/[[:digit:]]\{1,\}/@/g'

\{1,\}代わりに、in *(それ自体はと同じです)を使用すると、前\{0,\}の式が少なくとも1つ以上一致するように強制されます。拡張正規表現の形式で作成された\{1,\}内容を表示できます。+

\{1,\}式から数字を削除し、代替値をとして残してs/[[:digit:]]/@/g各個々の数字をに置き換えることができます@

関連情報