
パイプ「|」区切り文字としてUnix CSVファイルがあります。ところで、viエディタで開くと、〜Gの形の追加文字がいくつかあります。しかし、猫をやるときは〜G文字がまったく見えません。
453136~G|OORAHASS0343136~G|汎用ボックスアクセス~G|NMBLDD~G|/rack=0/slot=1/port=7~G|20Mbit/s~G|80Mbit/s~G|IS
~G文字を削除する方法。
次の手順を試しましたが、運がありません。
sed -e 's/[^ -~]//g' file_in > file_out
または
grep -c '[^ -~]' file_in
または
sed -i 's/\~H//g;s/\~G//g' file_in
答え1
cat -e
0x87バイト(8進数では0207)でレンダリングしますM-^G
。文書1に示すように、vim
オプションが Unicode で、文字が有効な UTF-8 シーケンスの Forms 部分でない場合、バイト 0x87 がレンダリングされます。 (ASCII BEL文字の0x7をレンダリングします。)~G
encoding
<87>
encoding
^G
つまり、G
(ASCIIでは0x47)ビット7(要素)は1に設定され、ビット6は0(制御)に設定されます。このバイトはUTF-8で有効な文字を構成せず、通常制御文字(ESA
) ISO8859-x 文字セットの C1 セットにあります。
それを削除するには、次の操作を行います。
tr -d '\207' < file > file.new
GNUsed
や ksh93/zsh/bash などのシェルを使用して、以下をサポートします$'...'
。
sed -i $'s/\207//g' file
あなたの
sed 's/[^ -~]//g'
これは可能ですが、Cロケールでのみ可能です。他のロケールで一致する文字範囲は非常にランダムです。だから:
LC_ALL=C sed 's/[^ -~]//g' < file > file.new
(TABおよびCR(LFを除く)および非ASCII文字を含む他のすべての制御文字は削除されます。)
0x87 は windows-1252 文字セットでは ‡ です (時には latin1 または iso8859-1 で誤って呼び出される)。
ロケールの文字セットで対応する0x87を‡に変換したい場合(たとえば、これらのファイルはWindowsの世界から来ており、0x87の目的であるため)(対応する文字があると仮定)、次のものを使用できます。
iconv -f windows-1252 < file > file.new
1 ブラム・マレナ(2011-03-22)。 「印刷中」。 「オプション」。VIMリファレンスマニュアル。
答え2
coreutilsのツールのみを使用してください。
# Generate a test file
printf 'head\207\nsome text\207\nnew line' > /tmp/test.cchar
# And filter with tr
tr -d "\207" < /tmp/test.cchar > /tmp/test.filtered
答え3
これは~G
種文字ASCII 007です。ファイルを削除してその場所からファイルを更新する簡単な方法は次のとおりです。
perl -pi -e 's/\007//' file_in
また見てくださいASCIIテーブル
より複雑なsed
解決策は、シェル置換を使用することです。
sed -i 's/'`echo "\007"`'//' file_in
使用時に印刷されない文字を表示するオプションをcat
追加します。-e