Bash

bash替換變數中的特殊字元

  • October 29, 2021

管道 (|) 有限的文本文件從 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但沒有幫助。如果將來上傳的文件中有任何未知字元,我如何替換特殊字元不僅如此。

您可能有一個“bom”(字節順序標記,用於基於 unicode 語言環境的系統來指定係統的“小端”/“大端”

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"

引用自:https://unix.stackexchange.com/questions/675318