GNU/Linux >> Linux の 問題 >  >> Linux

BashでファイルにUTF-8 BOMがあるかどうかを検出する方法は?

まず、head であることを示しましょう。 実際に正しく動作しています:

$ printf '\xef\xbb\xbf' >file
$ head -c 3 file 
$ head -c 3 file | hexdump -C
00000000  ef bb bf                                          |...|
00000003

それでは、機能する関数 has_bom を作成しましょう . grep の場合 -P をサポート の場合、1 つのオプションは次のとおりです。

$ has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes

現在、GNU grep のみ -P をサポート .

別のオプションは、bash の $'...' を使用することです :

$ has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes

kshzsh $'...' もサポート しかし、この構造は POSIX および dash ではありません はサポートしていません。

注:

<オール>
  • 明示的な return $? の使用 オプションです。この関数は、デフォルトで、最後に実行されたコマンドの終了コードを返します。

  • 関数の定義には POSIX 形式を使用しました。これは bash 形式と同等ですが、別のシェルで関数を実行する必要がある場合に対処する問題が 1 つ少なくなります。

  • bash は文字 - の使用を受け入れます 関数名に含まれていますが、これは物議を醸す機能です。 _ に置き換えました これはより広く受け入れられています。 (この問題の詳細については、この回答を参照してください。)

  • -q grep へのオプション 静かにします。つまり、適切な終了コードを設定しますが、stdout には文字を送信しません。


  • 最初の読み取り行に以下を適用しました:

    read c
    if (( "$(printf "%d" "'${c:0:1}")" == 65279 ))  ; then c="${c:1}" ; fi
    

    これにより、変数から BOM が削除されるだけです。


    Linux
    1. Bashにシェルショックの脆弱性があるかどうかを確認する方法は?

    2. Utf-8ファイルからBOMを削除する方法は?

    3. ファイルがダウンロードされたことを検出することは可能ですか?

    1. バッシュを検出する方法>=4.0?

    2. Bashでファイルパスをどのように正規化しますか?

    3. Linux の Bash で syslog を確認するには?

    1. LinuxでファイルをUTF-8エンコーディングに変換する方法

    2. Bashでファイルが空かどうかを確認するには?

    3. bash シェルでファイルのセクションを grep する方法