文字列の後の文字を置き換える

文字列の後の文字を置き換える
S-123-P Bash Pocket Ref.        2010    Cengage Learning    $55
E-P234  Python Pocket Ref.      2012    Cengage Learning    $45
55-MNP  Unix System Programming 2001    Sybex               $230

$$with を除いて数字を変更する必要があるため、*出力は次のようになります。

S-123-P Bash Pocket Ref.        2010    Cengage Learning    $**
E-P234  Python Pocket Ref.      2012    Cengage Learning    $**
55-MNP  Unix System Programming 2001    Sybex               $***

最後の数字または最後の2桁を変更できましたが、gsubを$試しましたが、何も機能しないようです。sedawk

答え1

sedタブ/スペースやフィールドの意図に触れないという利点を享受できます。

sed -E ':a s/(\$\**)[^*]/\1*/; ta' infile

($<zero-or-more-*>)[<non-*-character>]すべてのsがsに変わるまで、それぞれを$<zero-or-more-*><plus-additional-*-added>\1*;は\1定義で最初に一致するグループの逆参照です)に置き換えます。sed(...)<non-*-character>*


少し複雑ですが、最後のフィールドだけを強制的に変更するには、次のようにコマンドを使用します。

sed -E ':a s/(\$\**)[^*]([^$]*)$/\1*\2/; ta' infile

答え2

awk/gsub を使用する - 最後のフィールドで次から始まる小数点桁を置き換えることができると仮定すると、次の$タスクを処理する必要はありません123$45 -> 123$**

awk '$NF ~ /\$[0-9]+/ {gsub(/[0-9]/,"*",$NF)} 1' file

答え3

Perlはこれを行うための良い方法を提供します(存在する場合)。

perl -lpe 's/\$([0-9]*)/"\$" . "*" x length($1)/e'

これは、正規表現置換の代替部分を固定文字列(flag)ではなくPerl式にする機能を利用して、/e「完了するまで繰り返し」ループを必要とせずに、必要に応じて適切な数のアスタリスクを生成します。

関連情報