Bashでファイルのリテラル文字を印刷するには?

Bashでファイルのリテラル文字を印刷するには?

生成を制御できない間違ったxml文字を削除するために文字ごとにファイルをフィルタリングしたいが、あるファイルから別のファイルに単一の文字をコピーすることはできないようです。以前は、キャリッジリターンを含むテキスト部分をコピーしていましたが、printfキャリッジリターンを1つにコピーせずに空の長さの文字列にコピーします。私のコード:

infile=$1
outfile=$2
touch $outfile
while IFS= read -r -n1 char
do
        # display one character at a time
        printf "%s" "$char" >> $outfile
done < "$infile"
diff $infile $outfile

sedやawkを使用しても構いませんが、許可されている文字をエンコードする必要があります。 Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

ベストアンサー1

入力に問題はなく、read正常に読み取る必要があります。改行文字があるためですread。このread -d ''トリックを使用すると機能します。

echo $'\r' | { IFS= read -r -n1 x; echo "$x"|xxd; }          # CR
echo $'\n' | { IFS= read -r -n1 x; echo "$x"|xxd; }          # LF fails
echo $'\n' | { IFS= read -d '' -r -n1 x; echo "$x"|xxd; }    # LF ok

しかし、彼らが言ったように、おそらくシェルではそのようなことをしたくないでしょう。tr固定文字セットを削除するのに必要なのはこれですが、少なくともGNUはtr文字ではなくバイトとして機能するため、Unicodeではあまり使用されません。

私の考えでは、このPerlは、ロケールがUTF-8に正しく設定されている場合は、UTF-8データに対して機能する必要があると思います。

perl -C -pe 'tr/\x09\x0a\x0d\x20-\x{d7ff}\x{e000}-\x{fffd}\x{10000}-\x{10ffff}//cd' < in > out

しかし、テストしてみると良いと思います。私はUnicodeの問題に慣れていません。

tr/abc//cdabc(にリストされていない文字を削除すると、tr///実際に文字が別の文字に変換されます。perlop)。文字のリストと範囲を許可し、16進値で文字を表します。\xHHヘヘ、そして貴重な\x{HHHH}はははは。したがって上記の内容は0x09、、、、0x0aなど0x0d0x20すべてを許可します。0xd7ff

上記のリストは、質問で提供されたリストから直接インポートされます。これを変更する必要があるかどうかはエンドユーザーに任せます。

おすすめ記事