Добавление и удаление информации в текстовом файле

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Yora
Сообщения: 8

Добавление и удаление информации в текстовом файле

Сообщение Yora »

Есть, например файл.

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

hi
<много других строк не фиксированного размера>
unixforum


И есть фиксированные данные:

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

строка1
строка2
строка3
строка4
строка5


Нужно вставить эти данные перед "unixforum", получится так:

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

hi
<много других строк не фиксированного размера>
строка1
строка2
строка3
строка4
строка5
unixforum


Так же нужно удалить эти данные если они есть.
Хотелось бы сделать что-то в виде bash скприта, которые при первом запуске добавляет данные, при повторном удаляет.

Как вставить кусок данных (к примеру в txt файле) перед строкой?
Может ли sed работать с данными в тексте т.е. data=информация из файла, в выражении s/data/lost ?
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

Задача решается чисто sed'ом.
Вставить данные можно командой i. Можно также использовать команду e, это расширение GNU.

С удалением не все однозначно. Если можно удалять все строки "строка", не зависимо от того, где в файле они находятся, то это можно сделать командой d. Если же должны быть удалены только те, которые идут перед unixforum, то сделать это можно так: как только придет "строка1", считывать одну за другой строки командой N. Пришел unixforum — удаляем, пришла неподходящая строка, ну, прекращаем.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Добавление и удаление информации в текстовом файле

Сообщение watashiwa_daredeska »

Yora писал(а):
06.04.2011 19:56
Как вставить кусок данных (к примеру в txt файле) перед строкой?
Никак. Можно создать новый файл, в котором сформировать нужное содержимое, а потом подменить старый файл новым.

Nazyvaemykh писал(а):
06.04.2011 20:52
Задача решается чисто sed'ом.
sed с ключиком -i может сделать это прозрачно.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Добавление и удаление информации в текстовом файле

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

можно после:
sed -i '/unixforum/r fixed.file' some.file

как сделать «до» по-простому — в голову не приходит.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Добавление и удаление информации в текстовом файле

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

sash-kan писал(а):
07.04.2011 17:15
можно после:
sed -i '/unixforum/r fixed.file' some.file

как сделать «до» по-простому — в голову не приходит.

Можно как-то так, если файл небольшой:
sed -i "s/^unixforum$/$(sed <file 's/$/\\/' | tr '\n' n)&/"
"Красиво, но криво".
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

Shell

$ sed '/^unixforum/{h;s/.*/cat 2.txt/ep;g;}' 1.txt hi <много других строк не фиксированного размера> строка1 строка2 строка3 строка4 строка5 unixforum

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

sash-kan писал(а):
07.04.2011 17:15
как сделать «до» по-простому — в голову не приходит.

команда r стукнутая :-(
Выводит не тогда, когда надо, и ничего с ней не сделать.
вот частичное решение

Shell

$ sed -e '/^unixforum/r2.txt' -e 'x;${p;x};1d' 1.txt hi <много других строк не фиксированного размера> строка1 строка2 строка3 строка4 строка5 unixforum 111


неверно работает если строка посл. Это задержка печати на одну строку. Последнюю строку держать невозможно...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

команды r, R, и = выполняются в конце скрипта

нравится это кому-то или нет... потому невозможно вывести ДО последней строки этими командами.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

Возможно, самым понятным решением будет разбить исходный файл csplit'ом по слову unixforum. А потом склеить cat'ом. Не в одну строчку и с временными файлами, зато прямолинейно.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление и удаление информации в текстовом файле

Сообщение ZyX »

Yora писал(а):
06.04.2011 19:56
Есть, например файл.

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

hi
<много других строк не фиксированного размера>
unixforum


И есть фиксированные данные:

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

строка1
строка2
строка3
строка4
строка5


Нужно вставить эти данные перед "unixforum", получится так:

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

hi
<много других строк не фиксированного размера>
строка1
строка2
строка3
строка4
строка5
unixforum


Так же нужно удалить эти данные если они есть.
Хотелось бы сделать что-то в виде bash скприта, которые при первом запуске добавляет данные, при повторном удаляет.

Как вставить кусок данных (к примеру в txt файле) перед строкой?
Может ли sed работать с данными в тексте т.е. data=информация из файла, в выражении s/data/lost ?

Решение на zsh:

~/tmp/zsh/append-remove.zsh (Created by format.vim)

#!/bin/zsh emulate zsh typeset -gr file=${1:-/tmp/testfile} typeset -ga lines data IFS=$'\n' cat $file | \ while read -r line ; do lines+=( "$line" ) done data=( line1 line2 line3 line4 line5 ) typeset -gir ufline=${lines[(ie)unixforum]} typeset -gir lidx=ufline-$#data typeset -gir ridx=ufline-1 if (( ufline>$#data )) && [[ "${(F)data}" == "${(F)lines[lidx,ridx]}" ]] ; then lines[lidx,ridx]=() else lines[ufline-1]+=( $data ) fi echo "${(F)lines}" > $file


При первом запуске добавляет данные, при втором удаляет. Замечу, что если в файле нет строки «unixforum», то добавляться/удаляться данные будут в конец файла, так как я не сделал проверку на то, найдена ли строка.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Добавление и удаление информации в текстовом файле

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

ZyX писал(а):
08.04.2011 00:55
Решение на zsh
краткость — сестра таланта. а элегантность — супруга.

p.s. ждём варианта на brainfucksh
и устроим соревнование: у кого длиннее.
код, естественно, а не то, что вы подумали.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление и удаление информации в текстовом файле

Сообщение ZyX »

sash-kan писал(а):
08.04.2011 04:26
ZyX писал(а):
08.04.2011 00:55
Решение на zsh
краткость — сестра таланта. а элегантность — супруга.

p.s. ждём варианта на brainfucksh
и устроим соревнование: у кого длиннее.
код, естественно, а не то, что вы подумали.

Я не понял — это к чему? Предлагаете сократить или жалуетесь, что непонятно?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Добавление и удаление информации в текстовом файле

Сообщение /dev/random »

ed a.txt <<<$'/unixforum/-1r b.txt\nw'
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

sash-kan писал(а):
08.04.2011 04:26
краткость — сестра таланта

ну короче 3х команд sed Добавление и удаление информации в текстовом файле
вряд-ли будет...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Добавление и удаление информации в текстовом файле

Сообщение /dev/random »

drBatty писал(а):
08.04.2011 09:31
ну короче 3х команд sed Добавление и удаление информации в текстовом файле
вряд-ли будет...

В моём варианте 41 символ (upd: уже 38) против 48 в вашем. Возможно, кто-то и ещё короче моего придумает.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

А можно в качестве ed использовать vim, он, наверное, даже больше где установлен:
vim -es world <<END
/unixforum/-1 r hello
wq
END

Добавлено: hello и world здесь названия файлов. (:
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

/dev/random писал(а):
08.04.2011 09:50
В моём варианте 41 символ (upd: уже 38) против 48 в вашем. Возможно, кто-то и ещё короче моего придумает.

можно и мой пример укоротить. лень...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Добавление и удаление информации в текстовом файле

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

ZyX писал(а):
08.04.2011 08:36
sash-kan писал(а):
08.04.2011 04:26
ZyX писал(а):
08.04.2011 00:55
Решение на zsh
краткость — сестра таланта. а элегантность — супруга.

p.s. ждём варианта на brainfucksh
и устроим соревнование: у кого длиннее.
код, естественно, а не то, что вы подумали.

Я не понял — это к чему? Предлагаете сократить или жалуетесь, что непонятно?
сокращать не предлагаю. как ни крути, на любом универсальном языке программирования решение задачи выйдет громоздким.
по сравнению с решением на специализированном языке типа реализованного в ed/sed.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

Я бы не стал только называть брейнфак универсальным языком программирования все-таки… :-/
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

Nazyvaemykh писал(а):
08.04.2011 16:37
Я бы не стал только называть брейнфак универсальным языком программирования все-таки…

зря. он универсальный.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

А ведь даже чисто на shell записать можно проще, короче и понятнее, чем приведенный выше текст на zsh. К тому же, в вышеприведенном тексте используется команда cat, не являющаяся встроенной командой zsh, тот текст еще и нечистый.

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

#!/bin/bash
flag="flag"
while read s; do
    if [[ "$s" = "unixforum" && -v flag ]]
    then
        unset flag
        while read p; do
            echo $p
        done < fix.txt
    fi
    echo $s
done

¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

Nazyvaemykh писал(а):
08.04.2011 21:39
А ведь даже чисто на shell записать можно проще, короче и понятнее

можно на shell+sed
N=`sed -n '/unixforum/='`
M=(( N - 1 ))
sed "1,$M"
cat other-file
sed "$N,\$"

т.е. получаем номер строки с unixforum, выводим 1ю часть, другой файл, и вторую часть. ИМХО самое простое и понятное.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
taaroa
Сообщения: 1319

Re: Добавление и удаление информации в текстовом файле

Сообщение taaroa »

прошу прощения за оффтоп, но просто вспомнилось...
:wq
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

drBatty писал(а):
08.04.2011 21:48
Nazyvaemykh писал(а):
08.04.2011 21:39
А ведь даже чисто на shell записать можно проще, короче и понятнее

можно на shell+sed
N=`sed -n '/unixforum/='`
M=(( N - 1 ))
sed "1,$M"
cat other-file
sed "$N,\$"

т.е. получаем номер строки с unixforum, выводим 1ю часть, другой файл, и вторую часть. ИМХО самое простое и понятное.

Самое простое, я писал, выше:
csplit inputfile "/unixforum/"
cat xx00 fix.txt xx01

И да, у вас не shell+sed, а shell+cat+sed
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

Nazyvaemykh писал(а):
08.04.2011 22:01
Самое простое, я писал, выше:
csplit inputfile "/unixforum/"
cat xx00 fix.txt xx01

ну можно и так. В принципе csplit легко эмулируется sed-ом (команда W).
Nazyvaemykh писал(а):
08.04.2011 22:01
И да, у вас не shell+sed, а shell+cat+sed

замените cat на sed '' :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Добавление и удаление информации в текстовом файле

Сообщение ZyX »

Nazyvaemykh писал(а):
08.04.2011 21:39
А ведь даже чисто на shell записать можно проще, короче и понятнее, чем приведенный выше текст на zsh. К тому же, в вышеприведенном тексте используется команда cat, не являющаяся встроенной командой zsh, тот текст еще и нечистый.

Вам будет легче, если я заменю cat на <? В zsh это будет работать точно также (и именно в таком виде: < $file | command).
Nazyvaemykh писал(а):
08.04.2011 21:39

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

#!/bin/bash
flag="flag"
while read s; do
    if [[ "$s" = "unixforum" && -v flag ]]
    then
        unset flag
        while read p; do
            echo $p
        done < fix.txt
    fi
    echo $s
done

Так, добавление я увидел. Где удаление?

// Кстати, вы думаете, я зря написал IFS=$'\n' и read -r?
Здесь
1) уберутся все пробелы и табуляция из начала строки
2) оставшиеся символы табуляции превратятся в пробелы
3) все пробелы превратятся в один
4) уберутся пробелы в конце строки
5) уберутся все нулевые байты


Резюмирую тему: из всех написанных здесь решений ровно одно выполняет поставленную задачу:
Yora писал(а):
06.04.2011 19:56
Так же нужно удалить эти данные если они есть.
Хотелось бы сделать что-то в виде bash скприта, которые при первом запуске добавляет данные, при повторном удаляет.

Догадайтесь, чьё?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Добавление и удаление информации в текстовом файле

Сообщение drBatty »

ZyX писал(а):
09.04.2011 01:12
при повторном удаляет.

удаление тривиально, ТС сам сделает.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Добавление и удаление информации в текстовом файле

Сообщение Nazyvaemykh »

ZyX, спасибо за замечание про read!

Ладно, занудства ради посмотрим, что там с удалениямиZyX, чтобы один и тот же скрипт и удалял и добавлял…На основе sed-варианта от drBatty:

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

$ sed -i ':a;/unixforum$/{tb;:b;s/\(fixline\n\)\+\(unixforum\)/\2/;tc;h;s/\n[^\n]*$//;p;s/.*/cat fix.txt/ep;g;s/.*\n//;:c;$!{N;bc;};};N;ba;' hello && cat hello
1
2
3
4
5
6
fixline
fixline
unixforum
7
8
9
10
$ sed -i ':a;/unixforum$/{tb;:b;s/\(fixline\n\)\+\(unixforum\)/\2/;tc;h;s/\n[^\n]*$//;p;s/.*/cat fix.txt/ep;g;s/.*\n//;:c;$!{N;bc;};};N;ba;' hello && cat hello
1
2
3
4
5
6
unixforum
7
8
9
10
$ sed -i ':a;/unixforum$/{tb;:b;s/\(fixline\n\)\+\(unixforum\)/\2/;tc;h;s/\n[^\n]*$//;p;s/.*/cat fix.txt/ep;g;s/.*\n//;:c;$!{N;bc;};};N;ba;' hello && cat hello
1
2
3
4
5
6
fixline
fixline
unixforum
7
8
9
10

Здесь предполагается, что фиксированные строки удовлетворяют регулярному выражению fixline, строка unixforum — выражению unixforum.
Может быть, можно и короче, не знаю. Конструкцию :c;$!{N;bc} можно естественно укоротить до :c;N;bc…
Ну и в условии ничего не сказано, что делать, если несколько строк unixforum в файле: обрабатывать все или только некоторые. Да и возможно ли такое. Я вот сделал, чтобы только первая строка обрабатывалась.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали: