テキストファイルの特定の行(たとえば、1123番目、以下を参照)を見ると、改行なしのスペースがあるようですが、わかりません。
$ cat myfile.csv | sed -n 1123p | cut -f2
Lisztes feher
$ cat myfile.csv | sed -n 1123p | cut -f2 | od -An -c -b
L i s z t e s 302 240 f e h e r \n
114 151 163 172 164 145 163 302 240 146 145 150 145 162 012
ただし、8進数の ASCIIコード は、改行なしスペースが240であることを示します。302は何に対応していますか?これはこの特定のファイルに固有のものですか?
理解するために質問をしています。私はすでにsed
を使用して問題を解決する方法を知っています。これは answer に従います:
$ cat myfile.csv | sed -n 1123p | cut -f2 | sed 's/\xC2\xA0/ /g' | od -An -c -b
L i s z t e s f e h e r \n
114 151 163 172 164 145 163 040 146 145 150 145 162 012
詳細については、元のファイルは.xlsx( Excel )形式です。私のコンピューターは Xubunt を実行しているので、 LibreOffice Calc(v5.1)で開きました。次に、「文字セット= Unicode(UTF-8)」とフィールド区切り記号としてタブを使用して、「テキストCSV」として保存しました。
$ file myfile.csv
myfile.csv: UTF-8 Unicode text
これは、U + 00A0 Unicode文字のUTF-8エンコードです。
$ unicode U+00A0
U+00A0 NO-BREAK SPACE
UTF-8: c2 a0 UTF-16BE: 00a0 Decimal:   Octal: \0240
Category: Zs (Separator, Space)
Bidi: CS (Common Number Separator)
Decomposition: <noBreak> 0020
$ locale charmap
UTF-8
$ printf '\ua0' | od -to1
0000000 302 240
0000002
UTF-8は、文字あたりのバイト数が可変のUnicodeのエンコーディングです。文字セットとしてのUnicodeは、iso8859-1(別名latin1)のスーパーセットであり、ASCIIのスーパーセットです。
Iso8859-1では、非改行文字(Unicodeのようにiso8859-1のコードポイント0xa0)は1つの0xa0バイトとして表現されますが、UTF-8では、コードポイント0〜127のみが1バイトとして表現されます(これにより、UTF-8はASCIIまたは言い換えればASCIIファイルもUTF-8ファイルです)のスーパーセットになります。
128を超えるコードポイントは、文字あたりのバイト数が多くなるようにエンコードされます。 UTF-8エンコードアルゴリズムの詳細については Wikipedia を参照してください。