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"

相关内容