[英]Bash shell scripting: How to replace characters at specific byte offsets
我正在尋找替換特定字節偏移的字符。
這是提供的內容:一個簡單的ASCII文本輸入文件。 Bash shell腳本中的數組,數組的每個元素都是一個數字字節偏移值。
目標:獲取輸入文件,並在每個字節偏移集中,用星號替換字符。
所以基本上我想到的想法是以某種方式逐個字節地瀏覽文件,如果讀取的當前字節偏移量與偏移量數組中的元素值匹配,則將該字節替換為星號。
這篇文章似乎表明dd命令是這個動作的一個很好的候選者,但我無法理解如何在輸入文件上多次執行替換。
輸入文件如下所示:
00000
00000
00000
偏移數組看起來像這樣:
offsetsArray=("2" "8" "9" "15")
輸出文件的所需格式如下所示:
0*000
0**00
00*00
非常感謝您提供的任何幫助。 謝謝!
請檢查我關於換行偏移的評論。 假設這是正確的(注意我已經改變了你的偏移數組),那么我認為這應該適合你:
#!/bin/bash
read -r -d ''
offsetsArray=("2" "8" "9" "15")
txt="${REPLY}"
for i in "${offsetsArray[@]}"; do
txt="${txt:0:$i-1}*${txt:$i}"
done
printf "%s" "$txt"
說明:
read -d ''
讀取整個輸入(重定向文件)進入$REPLY
變量。 如果你有大文件,這可能會讓你內存不足。 i
從字符串的開頭抓取i-1
字符,然后插入一個*
字符,然后從offset i
添加剩余的字節。 這是通過bash參數擴展完成的 。 請注意,雖然您的偏移量是基於一的,但是bash字符串使用從零開始的索引。 正在使用:
$ ./replacechars.sh < input.txt
0*000
0**00
00*00
$
警告:
這不是一個非常有效的解決方案,因為它會導致包含整個文件的sting被復制到每個偏移量。 如果您有大文件和/或大量偏移,那么這將運行緩慢。 如果你需要更快的東西,那么允許修改字符串中的單個字符的另一種語言會好得多。
dd
的使用在當時可能有點令人困惑,但並不難:
outfile="test.txt"
# create some test data
echo -n 0123456789abcde > "$outfile"
offsetsArray=("2" "7" "8" "13")
for offset in "${offsetsArray[@]}"; do
dd bs=1 count=1 seek="$offset" conv=notrunc of="$outfile" <<< '*'
done
cat "$outfile"
對於此示例重要的是使用conv=notrunc
,否則dd會將文件截斷為它所尋找的塊的長度。 bs=1
指定您要使用大小為1的塊,並且seek
指定要將寫入count
塊的satart設置為。
以上產生01*3456**9abc*e
與@ DigitalTrauma的卓越解決方案具有相同的偏移考慮因素,這是基於GNU awk的替代方案。 假設您的文件不包含空字節
(IFS=','; awk -F '' -v RS=$'\0' -v OFS='' -v offsets="${offsetsArray[*]}" \
'BEGIN{split(offsets, o, ",")};{for (k in o) $o[k]="*"; print}' file)
0*000
0**00
00*00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.