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を$
試しましたが、何も機能しないようです。sed
awk
答え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
「完了するまで繰り返し」ループを必要とせずに、必要に応じて適切な数のアスタリスクを生成します。