LINUX.ORG.RU

[awk] помогите распарсить файл


0

1

Есть файл в котором перечислены названия утилит. Выглядит он так:

[^@[[^@acpid^@adjtimex^@arp^@arping^@ash^@awk...
Собственно нужно его разобрать на
[
[[
acpid
adjtimex
...

Проблема состоит в том, что awk ничего не выводит если указать разделитель целиком:

$ awk -v RS='\^\@' '{gsub(/\n/," ");print}' myfile
awk: warning: escape sequence `\^' treated as plain `^'
awk: warning: escape sequence `\@' treated as plain `@'
Это весь вывод. Но если указать только один символ, то всё отлично работает:
$ awk -v RS='\^' '{gsub(/\n/," ");print}' myfile
awk: warning: escape sequence `\^' treated as plain `^'
[
@[[
@acpid
@adjtimex
$ awk -v RS='\@' '{gsub(/\n/," ");print}' myfile
awk: warning: escape sequence `\@' treated as plain `@'
[^
[[^
acpid^
adjtimex^

Конечно не проблема удалить лишние ^ или @, но как всё таки заставить awk нормально тут отработать?

Тут, наверное, разделено символом '\0'.

gentoo_root ★★★★★ ()
Ответ на: комментарий от fork_you

Здорово, но исходный файл не конвертится:

iconv: illegal input sequence at position 0
Вообще mc сказал, что это «ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped».

А в текстовом уже вроде всё в норме: http://s017.radikal.ru/i418/1110/66/052d5ce5ebee.png

SysPupkin ()
$ echo "[^@[[^@acpid^@adjtimex^@arp^@arping^@ash^@awk" | sed 's/\^@/\n/g'
[
[[
acpid
adjtimex
arp
arping
ash
awk
drBatty ★★ ()
Ответ на: комментарий от fork_you

>предпочитаю использовать сед для простых задач. в нем @ не является служебным символом, бэкслешить не надо.

зато ^ надо бекслешать. Сорри, прочитал ваш коммент уже после написания своего.

drBatty ★★ ()
Ответ на: комментарий от fork_you
cat myfile | sed 's/\^@/\n/g'

Справился, а вот awk по прежнему не работает для обоих символов.

awk -v RS='\x5e\x40' '{gsub(/\n/," ");print}' myfile
Выводит весь файл. По отдельности символы работают.

Впрочем, не важно, я уже нашел другое решение проблемы из-за которой мне нужно было парсить файл :)

Всем большое спасибо за участие.

SysPupkin ()

что-то вы тут слишком сложно чудите, попробуй ка:

cat file | xargs -0 printf «%s\n»

beastie ★★★★★ ()
Ответ на: комментарий от SysPupkin

Если тема закрыта, отметьте её как решёную.

А так, лучше порочитать man, там написано, что когда RS содержит более одного символа он считается регулярным выражением (расширение GNU). Поставьте RS='\\^\\@'.

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо, работает. Теперь действительно можно отметить как решенную.

SysPupkin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.