bash 替換變數中的特殊字符

bash 替換變數中的特殊字符

管道 (|) 限製文字檔案從 Windows 應用程式傳輸以進行處理。處理時,文件第一行第一列有一個特殊字元。這是從 Windows 傳輸之前文件在記事本中的外觀

Sector|Name|Manager|...

當我讀取時IFS='|' read -r -a fields < "/uploads/file_data.txt",第一列磁區被讀取為"Sector"帶有特殊字元前綴。

當我這樣做時,head -1 "/uploads/file_data.txt" | od -c列印的值是

0000000 357 273 277   S   e   c   t   o   r   |

我嘗試過tr -d < //uploads/file_data.txt > /uploads/file_data_temp.txt但沒有幫助。如果將來上傳的文件中有任何未知字符,我該如何替換特殊字符?

答案1

您可能有一個“bom”(位元組順序標記,在基於 unicode 語言環境的系統上使用,用於指定係統的“little-endian”/“big-endian”性質

https://en.wikipedia.org/wiki/Byte_order_mark

值得慶幸的是,這個似乎適用於 utf-8 語言環境,如果您只期望 ASCII 1-177 個字符,這是一件好事...

您可以透過插入一個被迫(暫時)使用 C 語言環境的 sed 來將其刪除,以便「看到」以下內容:

LC_ALL=C sed '1s/^\xEF\xBB\xBF//' 

例如用作:

incoming program | LC_ALL=C sed '1s/^\xEF\xBB\xBF//' | somecmd
 # or
< incomingfile LC_ALL=C sed '1s/^\xEF\xBB\xBF//' > outputfile
  #  <incomingfile  : will give "incomingfile" content as stdin to sed 
  # then sed modifies only the first line, replacing the BOM with ""
  #    (the rest is not touched by sed and is transmitted as-is)
  #  > outputfile : directs sed output (ie, incomingfile without the BOM) to "outputfile"

相關內容