生成を制御できない間違った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//cd
abc
(にリストされていない文字を削除すると、tr///
実際に文字が別の文字に変換されます。perlop
)。文字のリストと範囲を許可し、16進値で文字を表します。\xHH
ヘヘ、そして貴重な\x{HHHH}
はははは。したがって上記の内容は0x09
、、、、0x0a
など0x0d
の0x20
すべてを許可します。0xd7ff
上記のリストは、質問で提供されたリストから直接インポートされます。これを変更する必要があるかどうかはエンドユーザーに任せます。