Как удалить нечисловой мусор из файла - PullRequest
2 голосов
/ 02 мая 2011

Вот вывод из less:

487451
487450<A3><BA>1<A3><BA>1
487449<A3><BA>1<A3><BA>1
487448<A3><BA>1<A3><BA>1
487447<A3><BA>1<A3><BA>1
487446<A3><BA>1<A3><BA>1
487445<A3><BA>1<A3><BA>1
484300<A3><BA>1<A3><BA>1
484299<A3><BA>1<A3><BA>1
484297<A3><BA>1<A3><BA>1
484296<A3><BA>1<A3><BA>1
484295<A3><BA>1<A3><BA>1
484294<A3><BA>1<A3><BA>1
484293<A3><BA>1<A3><BA>1
483496
483495
483494
483493
483492
483491

Я вижу здесь кучу непечатных символов.Как мне удалить их, используя sed / tr?

Моя попытка была 's/\([0-9][0-9]*\)/\1/g', но она не работает.

РЕДАКТИРОВАТЬ : Хорошо,пойдем дальше вниз по источнику.Числа извлечены из этого файла:

487451"><img src="Manage/pic/20100901/Adidas running-429.JPG" alt="Adidas running-429" height="120" border="0" class="BK01" onload='javascript:if(this.width>160){this.width=160}' /></a></td>
487450"><img src="Manage/pic/20100901/Adidas fs 1<A3><BA>1-060.JPG" alt="Adidas fs 1<A3><BA>1-060" height="120" border="0" class="BK01" onload='javascript:if(this.width>160){this.width=160}' /></a></td>

Первая строка совершенно нормальна и то, что большинство строк.Второй «поврежден».Я просто хотел бы извлечь число в начале (используя 's/\([0-9][0-9]*\).*/\1/g', но каким-то образом непечатаемые элементы попадают в регулярное выражение, которое должно остановиться на ".

EDIT II :Вот пояснение: В текстовом файле нет скобок. Это коды символов непечатаемых символов. Скобки есть, потому что я скопировал файл из less. Терминал Mac, с другой стороны, использует?? для представления таких символов. Держу пари, xterm на моем Ubuntu напечатает этот белый овал с вопросительным знаком.

Ответы [ 5 ]

7 голосов
/ 02 мая 2011

Классическое задание для sed или Unix tr команды.

sed 's/[^0-9]//g' $file

(все, что не является цифрой или переводом строки), удаляется.)

tr -cd '0-9\012' < $file > $file.1

Удалить (-d) дополнение (-c) цифр и символа новой строки ...

2 голосов
/ 02 мая 2011

Вы пропустили бит, в котором вы соответствуете остальной части строки.

sed 's/\([0-9][0-9]*\)[^0-9]*/\1/g' 
                      ^^^^^^^
0 голосов
/ 07 июня 2013

Если данные всегда похожи на образец, удаление с менее чем до конца строки будет работать нормально.sed -i "s /<.*$//" file </p>

0 голосов
/ 02 мая 2011

Попробуйте команду sed:

sed 's/^\([0-9][0-9]*\).*$/\1/' file.txt

OUTPUT (выполнение вышеуказанной команды для указанного вами входного файла)

487451
487450
487449
487448
487447
487446
487445
484300
484299
484297
484296
484295
484294
484293
483496
483495
483494
483493
483492
483491
0 голосов
/ 02 мая 2011

Если вы знаете, что дерьмо всегда будет в скобках, почему бы не удалить это дерьмо?

sed 's/<[^>]*>//g'

РЕДАКТИРОВАТЬ: Спасибо, Майк, это имеет смысл. В таком случае, как насчет:

sed 's/([0-9]+).*/\1/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...