Нужно перекодировать выборочно строчки в файле

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
Sten
Бывший модератор
Сообщения: 78
Статус: admin.. just admin..
ОС: FreeBSD 7.0-STABLE

Нужно перекодировать выборочно строчки в файле

Сообщение Sten »

Имеем файл типа:

[Message]
Text="<текст_в_KOI8-R>"
Background=16777215
Foreground=0
Time=1122989527
[ICQMessage]
Flags=1
Background=16777215
Foreground=0
Time=1122989831
ServerText="<текст_в_CP1251>"

Это многократно повторяется
нужно кои8 оставить в кои8, СР1251 перекодировать в кои8
Алгоритм, настолько я понимаю, примерно такой:

1. Ищем строчку, начинающуюся на ServerText
2. Перекодируем её из СР1251 в KOI8-R
3. Идём искать следующую такую строчку (GO TO 1)

ЗЫЖ FreeBSD 5.4 :devil_2:
Сумасшедший юниксоид в синей футболке с рыбой(с)

Ошибки юности легко сходили с pyк
Ах, молодость, - волшебный звyк свиpели.
Мы часто под собой пилили сyк.
Тепеpь и мы не те, и сyки постаpели.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Нужно перекодировать выборочно строчки в файле

Сообщение t.t »

(Sten @ Понедельник, 08 Августа 2005, 16:25) писал(а):1. Ищем строчку, начинающуюся на ServerText
А, ну так бы сразу и сказал. Я не понял, что ср1251 бывает только после ServerText. Тогда это вопрос к знатокам седа -- там это, я так понимаю, задачка на тфу.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Нужно перекодировать выборочно строчки в файле

Сообщение xorader »

помоему в sed'е можно внешнюю команду вызывать на найденное совпадение -- отсюда и копать (sed -> iconv)

а, вообще:

Код: Выделить всё

perl -e 'while (<STDIN>) { if (m/^ServerText/) { my ($tmp_str) = `echo "$_" | iconv -f cp1251 -t koi8-r`; printf $tmp_str; } else {print;}} ' < file.txt > file-out.txt
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Аватара пользователя
Sten
Бывший модератор
Сообщения: 78
Статус: admin.. just admin..
ОС: FreeBSD 7.0-STABLE

Re: Нужно перекодировать выборочно строчки в файле

Сообщение Sten »

Для xorader:
Практически оно, но часть текста вообще удаляет..
Наверное, всё-таки дожидаемся из отпуска madskull`a по вопросу sed`a..
Сумасшедший юниксоид в синей футболке с рыбой(с)

Ошибки юности легко сходили с pyк
Ах, молодость, - волшебный звyк свиpели.
Мы часто под собой пилили сyк.
Тепеpь и мы не те, и сyки постаpели.
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Нужно перекодировать выборочно строчки в файле

Сообщение xorader »

вот исправленный вариант:

Код: Выделить всё

perl -e 'while (<STDIN>) { if (m/^ServerText/) { chomp; my ($tmp_str) = `echo $_ | iconv -c -f cp1251 -t koi8-r`; print $tmp_str; } else {print;}} '  < file.txt > file-out.txt
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Нужно перекодировать выборочно строчки в файле

Сообщение sash-kan »

Для Sten:

Код: Выделить всё

sed -ie '/^ServerText/{s/"/\\"/g;s/^\(.*\)$/echo "\1"\|iconv -f cp1251 -t koi8r/e}' some.file
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Нужно перекодировать выборочно строчки в файле

Сообщение xorader »

s/чтототам/внешняя_команда/e <- я правильно понял ? нигде не найду описания флага "e" :(
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Нужно перекодировать выборочно строчки в файле

Сообщение sash-kan »

(xorader @ Среда, 10 Августа 2005, 9:06) писал(а):s/чтототам/внешняя_команда/e <- я правильно понял

не совсем так. читай info sed:
(xorader @ Среда, 10 Августа 2005, 9:06) писал(а):нигде не найду описания флага "e"

info sed -> sed programs -> extended commands
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Нужно перекодировать выборочно строчки в файле

Сообщение xorader »

спасибо...
info sed -> sed programs -> The "s" Command
Нашёл описание:
`e'
    This command allows one to pipe input from a shell command into
    pattern space.  If a substitution was made, the command that is
    found in pattern space is executed and pattern space is replaced
    with its output.  A trailing newline is suppressed; results are
    undefined if the command to be executed contains a NUL character.
    This is a GNU `sed' extension.
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали: