
この問題を解決する方法を尋ねたいと思います。単語が4文字未満のすべての行の前にゼロを追加する必要があります。
入力ファイルの例:
30
1
508
A0EA
A0EB
A0EC
A0ED
必要な出力は次のようになります。
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
ご支援ありがとうございました。
答え1
すべての行に4つの前に0を追加してから、各行の最後の4文字を取得できます。
sed 's/^/0000/; s/^.*\(.\{4\}\)/\1/' < file
または、最初から4桁より広い数字を切らないでください。
sed 's/^/0000/; s/^.\{1,4\}\(.\{4\}\)/\1/' < file
答え2
ブレンドもあります:
$ numfmt --format='%04.0f' --invalid=ignore < file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
numfmt
GNU Coreutils パッケージで提供されます。
答え3
入力が16進数の場合は、strtonum()にGNU awkを使用してください。
$ awk '{printf "%04X\n", strtonum("0x"$0)}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
入力が16進数であるかどうかにかかわらず、GNU awkを使用してください。
$ awk '{print gensub(/ /,0,"g",sprintf("%4s",$0))}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
awkの場合、入力が16進数であるかどうかにかかわらず、次のことを行います。
$ awk '{v=sprintf("%4s",$0); gsub(/ /,0,v); print v}' file
0030
0001
0508
A0EA
A0EB
A0EC
でも:
$ awk '{$0=sprintf("%4s",$0); gsub(/ /,0)} 1' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
答え4
zsh
シェルの場合は、l:length::string:
左側のパディング引数を使用してフラグを拡張できます。
$ var=FF
$ echo ${(l:4::0:)var}
00FF
ファイル内のすべての単語に適用するには:
printf '%s\n' ${(l:4::0:)$(<file)}
この演算子も参照してください。カット4文字を超える単語です。