簡體   English   中英

Bash shell腳本:如何替換特定字節偏移處的字符

[英]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參數擴展完成的 請注意,雖然您的偏移量是基於一的,但是字符串使用從零開始的索引。

正在使用:

$ ./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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM