Die durch Pipe (|) begrenzte Textdatei wird zur Verarbeitung von einer Windows-Anwendung übertragen. Während der Verarbeitung befindet sich in der ersten Spalte in der ersten Zeile der Datei ein Sonderzeichen. So sieht die Datei im Editor aus, bevor sie von Windows übertragen wird
Sector|Name|Manager|...
Beim Lesen IFS='|' read -r -a fields < "/uploads/file_data.txt"
wird der erste Spaltensektor als "Sector"
mit vorangestellten Sonderzeichen gelesen.
Wenn ich das mache, head -1 "/uploads/file_data.txt" | od -c
ist der gedruckte Wert
0000000 357 273 277 S e c t o r |
Ich habe es versucht, tr -d < //uploads/file_data.txt > /uploads/file_data_temp.txt
aber es hat nicht geholfen. Wie ersetze ich die Sonderzeichen, nicht nur das, wenn in der Datei, die ich in Zukunft hochlade, unbekannte Zeichen vorhanden sind?
Antwort1
Sie haben wahrscheinlich eine "bom" (Byte Order Mark, die auf Unicode-basierten Systemen verwendet wird, um die "Little-Endian"/"Big-Endian"-Eigenschaft des Systems anzugeben.
sehenhttps://en.wikipedia.org/wiki/Byte_order_mark
Glücklicherweise scheint es sich dabei um das Gebietsschema UTF-8 zu handeln, was gut ist, wenn Sie nur ASCII-Zeichen der Größen 1–177 erwarten ...
Sie könnten es entfernen, indem Sie ein Sed einfügen, das gezwungen wurde, (vorübergehend) das Gebietsschema C zu verwenden, um Folgendes zu „sehen“:
LC_ALL=C sed '1s/^\xEF\xBB\xBF//'
verwendet beispielsweise als:
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"