假設我有一個遵循此模式的檔案
112;167;82
16;104;2
24;163;3
67;195;48
我希望每個數字都轉換為十六進制。
70;A7;52
10;68;02
18;A3;03
43;C3;30
printf '%x\n' 確實有效,但一次只能用于一個實體。
uj5u.com熱心網友回復:
while IFS=';' read -a n ; do
printf 'X;' "${n[@]}"
echo
done < file | sed 's/;$//'
read -a將每一行讀入一個陣列,設定IFS設定分隔符,即陣列的元素將是每一行的數字;- 該
printf行列印陣列的每個元素,后跟 a;,sed之后在命令中洗掉尾隨的分號。 echo在每個列印陣列的末尾添加一個換行符。
uj5u.com熱心網友回復:
重擊:
while IFS=';' read -ra line; do
line=$(printf '%x;' "${line[@]}")
echo "${line%;}"
done < file
awk(對于較大的檔案可能更快):
awk '
BEGIN {FS=OFS=";"}
{for (i=1; i<NF; i ) {
$i = sprintf ("%x", $i)
}
print}' my-file
uj5u.com熱心網友回復:
awk -F ';' '{print toupper(sprintf("x;x;x",$1,$2,$3))}' file
輸出:
70;A7;52 10;68;02 18;A3;03 43;C3;30
uj5u.com熱心網友回復:
使用 sed
$ sed 's/;/ /g;s/.*/printf "x" & /e;s/[a-z0-9]\{2\}/\U&;/2;s/[a-z0-9]\{2\}/\U&;/' input_file
為了讓printf命令運行,;需要洗掉之后printf "x"才能執行。
輸出
70;A7;52
10;68;02
18;A3;03
43;C3;30
uj5u.com熱心網友回復:
由于已經發布了 bash、awk、sed 的好答案,那么perl解決方案如何
(盡管標簽中不包含 perl):
perl -pe 's/\d /sprintf("X", $&)/ge' file
- 該
-pe選項告訴 perl 逐行處理輸入并自動列印輸出。 - 在
s/../../操作者進行的置換為sed。 - 正則運算式
\d匹配一個數字序列。 - 變數
$&保存匹配的子字串。 - 運算子的
g選項s啟用全域替換為sed。 - 最后一個
e選項將右側評估為 perl 運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/359459.html
上一篇:比較值的簡單bash程式
