2014-07-24 2 views
4

Как заменить патроны (восьмеричное значение: 225, шестнадцатеричное число: 95) с пробелами?
Я попытался с помощью следующих команд:

Заменить все пули пробелами

echo '•test' | tr '\225' ' ' 

echo '•test' | awk '{gsub(/\225/," ");print $0}' 

echo '•test' | sed 's/\o225/ /g' 

echo '•test' | LANG='' sed 's/\o225/ /g' 

echo '•test' | sed 's/\x95/ /g' 


Эти команды не работают.

ответ

7

Давайте посмотрим на то, почему ваши нынешние усилия терпят неудачу:

$ echo '•test' | hexdump -C 
00000000 e2 80 a2 74 65 73 74 0a       |...test.| 
00000008 

Эти пули фактически три байта - e2 80 a2, а не один 0x95.

Исправленный СЕПГ выражение работает отлично:

echo '•test' | sed -e 's/•/ /g' 

... или (с помощью Баш-расширенный синтаксис не доступны в /bin/sh) ...

echo '•test' | sed -e $'[email protected]\xe2\x80\[email protected] @g' 

... или (с помощью Баш -builtin):

s='•test'    # original string in s 
orig='•'    # item to replace 
new=' '    # thing to replace it with 
s2=${s//"$orig"/$new} # result in s2 

... или (с использованием GNU sed extensions, per @anubhava) ...

echo '•test' | sed '[email protected]\xe2\x80\[email protected] @g' 
+0

Или: 'echo '• test' | sed 's/\ xe2 \ x80 \ xa2//' ' – anubhava

+0

Почему вы используете символ at (@)? Я протестировал с помощью следующей команды: echo '• test' | sed 's/\ xe2 \ x80 \ xa2// g'. Оно работает. – user2874781

+1

@ user2874781, я использую '@' как привычку, потому что '/' существует достаточно часто в заменяемом содержимом, чтобы сделать его слабым выбором сигилы. В этом конкретном случае не существует, поэтому он не имеет особого значения в любом случае.(Во многих ситуациях необходимость выбора сигилы, которая не может быть внутри данных, делает «sed» плохим выбором инструментов вообще). –

3

В дополнении к отличному ответу Чарльза Даффи, в байтах соответствующих характера пули может отличаться в зависимости от кодировки файла используется.

В качестве примера, пули является:

  • единственный байт 0x95, если файл кодируется как (Windows) CP1252

  • единственный байт 0xa5, если файл кодируется как (традиционный) Macintosh Roman кодировка

  • последовательность из трех байтов, если файл закодирован как UTF-8


Для "одного байта кодирования", tr был хороший улов. По себе, я бы выступал за немного другой синтаксис, но это должно работать:

sh$ tr $'\x95' ' ' < cp1252.txt 
test 

sh$ tr $'\xa5' ' ' < mac.txt 
test 

Если файл UTF-8 кодируются ... ну у вас уже есть ответ!

+0

+1: Я не искал, из какой кодировки возникло предположение «0x95», но это полезный фон. –

Смежные вопросы