web-dev-qa-db-ja.com

sedを使用して、nbsp、160、Hex 00a0、Octal 240、ノーブレークスペースを置き換えます

改行なしスペース 文字が含まれている設定ファイルで問題が発生しています。

その文字をsedで指定して、スペースに置き換えるにはどうすればよいですか。

sed -n 's/ / /g'

エラーの例

[。タイプ 'SOA' 
 named.localhost:8:不明なRRタイプ '@' 
 named.localhost:9:不明なRRタイプ '127.0.0.1' 
 named.localhost:10 :不明なRRタイプ ':: 1' 
 ..... 

この投稿には、元の問題のあるファイルの行を含めようとしました。動作していることは継ぎ目ではありません。 Pastebinダウンロードシームは、すべての元のバイナリを保持する唯一のツールです。 http://Pastebin.com/ZqT1EWbS 。元の行をコピーして貼り付け、端末で機能させることができるはずです。

8
nelaaro

この質問への答えは、遭遇しているノーブレークスペースの文字によって異なります。

以下は、質問のタイトルに記載されている改行しないスペース文字のそれぞれを置き換える方法の例です。さらに、Pastebinの出力に従ってOPが実際に要求しているUTF-8バージョン(C2 A0)を置き換えます。

すべての例では、printfよりも移植性が高いため、echoを使用して出力を生成します。スペース文字は、出力を明確にするためにXに置き換えられます。

html

printf '&#nbsp;\n' | sed 's/ /X/g'
printf ' \n'  | sed 's/&160;/X/g'
printf ' \n'  | sed 's/&[aA]0;/X/g'

8進数240 = 1進数160 = 16進数A0

printf '\xA0\n' | sed 's/\xA0/X/g'

またはtrを使用:

printf '\xA0\n' | tr '\240' 'X'

U + 00A0

printf '\x00\xA0\n' | sed 's/\x00\xA0/X/g'

UTF-8

printf '\xC2\xA0\n' | sed 's/\xC2\xA0/X/g'

結果

上記のすべての場合の出力は次のとおりです。

X

回答

今あなたの質問に、あなたはこのように見えるデータを持っています:

printf '@       IN SOA  @ rname.invalid. (' | od -x

出力:

0000000 c240 c2a0 c2a0 c2a0 c2a0 c2a0 20a0 4e49
0000020 5320 414f a0c2 4020 7220 616e 656d 692e
0000040 766e 6c61 6469 202e 0a28
0000052

C2 A0sを通常のスペースに置き換えるには、次を使用します。

printf '@       IN SOA  @ rname.invalid. (' | sed 's/\xC2\xA0/ /g' | od -x

出力:

0000000 2040 2020 2020 2020 4e49 5320 414f 2020
0000020 2040 6e72 6d61 2e65 6e69 6176 696c 2e64
0000040 2820 000a
0000044
17
Thor

私が実用的な解決策にたどり着くのを手伝ってくれたすべての人に感謝します。

この投稿には、元の問題のあるファイルの行を含めようとしました。動作していることは継ぎ目ではありません。 Pastebinダウンロードシームは、すべての元のバイナリを保持する唯一のツールです。 http://Pastebin.com/ZqT1EWbS 。元の行をコピーして貼り付け、端末で機能させることができるはずです。

したがって、8進数を削除するとどうなりますか\0240またはhex\xA0。それは他のいくつかのファンキーなキャラクターを追加します。

 $ echo "@ IN SOA @ rname.invalid。(" | sed -e "s/\ xA0 // g" 
 @���� ��INSOA�@rname.invalid。(

実際のファイルに印刷されていない余分なデータがいくつかあります。 od(octal dump) ツールは、行全体の実際の16進数/ 8進数/バイナリ値を表示するのに非常に便利であることがわかりました。

 $ echo "@ IN SOA @ rname.invalid。(" | od -x 
 0000000 c240 c2a0 c2a0 c2a0 c2a0 c2a0 20a0 4e49 
 0000020 5320 414f a0c2 4020 7220 616e 656d 692e 
 0000040 766e 6c61 6469 202e 0a28 
 0000052 

現れ続けた他のキャラクターは\xC2ノーブレークスペースの場合は印刷されません\xA0はありますが、nbspが削除されると表示されます。そのため、 @ Thor answer のsed行を変更して削除する必要がありました。

これは私のために働いたものです。

 $ echo "@ IN SOA @ rname.invalid。(" | sed -e "s/\ xC2\xA0// g" 
 @ IN = SOA @ rname.invalid。(
2
nelaaro