最初の4文字を除くすべての文字を置き換える

最初の4文字を除くすべての文字を置き換える

次のようにsedにコマンドを入力したいと思います。

md5sum input.txt | sed 's/^\(....\).*/\1/;q'

これはチェックサムの最初の4文字だけを出力することによって行われます。しかし、最初の4文字を出力したいのですが、他のすべての文字(編集情報)の代わりにxを使用したいと思います。私は今とても迷っています。

答え1

GNU Sedを使用すると、

md5sum input.txt | sed 's/./x/5g'

これは代替文字列の最初の4文字をスキップし、他のすべての文字を置き換えます。

AwkのPOSIXの代替案(より簡単なことがあるかもしれません)

md5sum xad | awk '{
  four=substr($0, 1, 4)
  rest=substr($0, 5)
  gsub(/./, "x", rest)
  print four, rest
}' OFS=""

答え2

POSIXlyでは、sedループを使用して、x4文字の接頭辞の後の最初の非文字を繰り返し置き換えることができます。

$ md5sum input.txt | sed '
:a
s/^\(....x*\)[^x]/\1x/
ta
'

最初のフィールド(チェックサム)のみを変更するには、[^x]に置き換えます。[^x ]

答え3

perl利用できない場合GNU sed

md5sum input.txt | perl -pe 's/^.{4}(*SKIP)(*F)|./x/g'

^.{4}(*SKIP)(*F)最初の4文字が置き換えられるのを防ぎます。

|.交換する必要がある代替パターンを指定します。


チェックサムのみを変更してください。

md5sum ip.txt | perl -pe 's/(^.{4}|\h.*$)(*SKIP)(*F)|./x/g'

md5sum出力がaで始まる場合\(たとえば、ファイル名に改行文字がある場合)、代わりにを使用して^\\?.{4}最初の^.{4}5文字のマスクを解除できます。

答え4

Quasímodoの答えの問題は、xファイル名も 's.'に置き換えることです。 OPはこれに関する後続の質問を投稿しました。sed宇宙で止まる解決策は次のとおりです。

md5sumハッシュに対して常に32文字の出力を生成します。スペースを検索する代わりに、32文字を検索してからスペースを検索し、最後の28文字をXに置き換えることができます。

md5sum input.txt | sed 's/^\([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
35c9xxxxxxxxxxxxxxxxxxxxxxxxxxxx  input.txt

分解の説明:

's/^\([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'

's/ A                                     / B                             /g'
we're substituting patterns matching A with B globally

's/   [a-zA-Z0-9]       [a-zA-Z0-9]       /                               /g'
we're looking for two groups of alphanumeric  characters

's/   [a-zA-Z0-9]\{4\}  [a-zA-Z0-9]\{28\} /                               /g'
The first group has exactly four characters
The second group has exactly twenty-eight characters

's/ \([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /                               /g'
The first group is a "capture group" which we can reference later

's/ \([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1                             /g'
We will print out the first group verbatim in the output

's/ \([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
We will print x's followed by a space for the next 28 characters

's/^\([a-zA-Z0-9]\{4\}\)[a-zA-Z0-9]\{28\} /\1xxxxxxxxxxxxxxxxxxxxxxxxxxxx /g'
The statement must appear at the start of a line and have a space at the end.

関連情報