Bashで$ 'text'は正確に何をしますか? Zshで使用できますか?

Bashで$ 'text'は正確に何をしますか? Zshで使用できますか?

私は最近走る次の提案ソリューションを入力してください。

cat results.csv | tr $'\x01' \\t > result.csv

無効な形式のcsvファイル(\x01Unicodeを区切り文字として使用するファイル)を変換してファイルを修正します。

$'\x01'はbashに正確に何をするように指示しますか?このコマンドはZshでは正しく動作しないようです。

重要な場合、実際の目標は次のように変換することです。

b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01707 Zsrn内\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011409 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\002 011050\x0112%

[全般]タブで区切られたcsvファイルに変換します。

Zshを使ってこれを試してみると、次のような結果が得られましたが、何も変わらないようです。

b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01707 Zsrn内\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011409 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\002 011050\x0112%

ベストアンサー1

Bashドキュメントから:

Words of the form $'string' are treated specially.  The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.  Backslash escape sequences, if present, are decoded
as follows:
       \a     alert (bell)
(...)
       \nnn   the eight-bit character whose value is  the  octal  value
              nnn (one to three digits)
       \xHH   the  eight-bit  character  whose value is the hexadecimal
              value HH (one or two hex digits)

したがって、公開された例では、$'\x01'説明に従ってコード1を持つ文字にすぎません。私の(非常に限定的な)テストでは、zshはこれをサポートしているようです。

$ printf %s $'\x01' | od -t x1
0000000 01
0000001

ただし、tr公開されたコマンドは、コメントが示すように、ファイルに実際にコード1のリテラル文字が含まれていると仮定する場合にのみ問題を解決します。\x01タブ文字は文字列でなければなりません。次のフィルタはこの問題を解決する必要があります。

sed 's/\\x01/\t/g'

おすすめ記事