замена строки в sed (*когда нибудь я напишу сам*)

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

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

Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

замена строки в sed

Сообщение tmp13 »

Вопрос вообщем то простой есть 2 файла
1 date.txt:

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

01.04.2004
03.04.2005
04.04.2006

2 lal.txt:

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

Hi DD.MM.YYYY


хотелось бы из этих 2-х файлов получить один красивый типа

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

Hi 01.04.2004
Hi 03.04.2005
Hi 04.04.2006


P.S смутное очучение того что это можно сделать чем то типа

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

cat date.txt| sed 'тут что-то' lal.txt > result.txt

изначально смотрел в сторону awk но там файл lal.txt придётся приводить к совсем другому виду.. а если этого не делать как то всё там сложно выходит..
а тут я просто не очень понимаю как передать sed строку из преведущей команды.
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: замена строки в sed

Сообщение Nazyvaemykh »

посмотрите в сторону paste. Например, как-то так: paste lal.txt dat.txt | sed 's/ .*\t/ /'
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: замена строки в sed

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

как-то так:

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

cat date.txt | while read d; do sed 's/DD\.MM\.YYYY/'$d'/' lal.txt; done
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: замена строки в sed

Сообщение drBatty »

tmp13 писал(а):
13.04.2010 19:52
P.S смутное очучение того что это можно сделать чем то типа

более универсальное решение: преобразовать DD.MM.YY в формат понятный команде date, а затем скормить ей и формат, и сами данные. Конечно проще сразу привыкнуть записывать данные в формате, который понимает date, тогда и sed будет тут лишней.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: замена строки в sed

Сообщение tmp13 »

Спасибо всем=)
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: замена строки в sed

Сообщение tmp13 »

э-э тут небольшая неувязочка получилась=)
1 date.txt:

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

01.04.2004
03.04.2005
04.04.2006

2.

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

Hi DD.MM.YYYY privet DD.MM.YYYY
LALAL DD.MM.YYYY


cat date.txt | while read d; do sed 's/DD\.MM\.YYYY/'$d'/' lal.txt; done
меняется только первые DD.MM.YYYY( а хотелось бы все
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: замена строки в sed

Сообщение Nazyvaemykh »

cat date.txt | while read d; do sed 's/DD\.MM\.YYYY/'$d'/g' lal.txt; done
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: замена строки в sed

Сообщение tmp13 »

как всё просто спасибо=)
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: замена строки в sed

Сообщение drBatty »

tmp13 писал(а):
15.04.2010 18:00
как всё просто спасибо=)

посмотрите внимательно на даты: вы действительно ЭТОГО хотите?
(последняя дата вообще не читается, а первая меняется дважды)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: замена строки в sed

Сообщение Nazyvaemykh »

Н-да, я, по-видимому, неправильно понял вопрос.
А если так:
cat date.txt | while read d; do sed '/DD\.MM\.YYYY/{s/DD\.MM\.YYYY/'$d'/;q}' lal.txt; done
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: замена строки в sed

Сообщение drBatty »

вот когда я пойму что надо, тогда и скрипт писать буду. :)

Nazyvaemykh писал(а):
15.04.2010 20:12
/DD\.MM\.YYYY/{s/DD\.MM\.YYYY/'$d'/

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

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

Re: замена строки в sed

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

tmp13 писал(а):
15.04.2010 17:08
э-э тут небольшая неувязочка получилась=)
1 date.txt:

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

01.04.2004
03.04.2005
04.04.2006

2.

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

Hi DD.MM.YYYY privet DD.MM.YYYY
LALAL DD.MM.YYYY


cat date.txt | while read d; do sed 's/DD\.MM\.YYYY/'$d'/' lal.txt; done
меняется только первые DD.MM.YYYY( а хотелось бы все

т.е., вы хотите, чтобы первое вхождение было заменено на первую дату, второе — на вторую, третье — на третью?
тогда бы я порекомендовал в файле lal.txt заменить строки ddmmmmy на уникальные:

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

Hi date1 privet date2
LALAL date3

после этого всё элементарно:

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

$ cat date.txt | while read d1; do read d2; read d3; sed 's/date1/'$d1'/;s/date2/'$d2'/;s/date3/'$d3'/;' lal.txt; done
Hi 01.04.2004 privet 03.04.2005
LALAL 04.04.2006
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: замена строки в sed

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

sash-kan писал(а):
15.04.2010 21:50
тогда бы я порекомендовал в файле lal.txt заменить строки ddmmmmy на уникальные:

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

Hi date1 privet date2
LALAL date3
Не совсем понятно, зачем:

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

$ echo q q q | sed 's/q/w/;s/q/e/;s/q/r/'
w e r
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: замена строки в sed

Сообщение Nazyvaemykh »

t.t, а если так:

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

echo -e 'q q q\nq q q' | sed 's/q/w/;s/q/e/;s/q/r/'
w e r
w e r

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

Re: замена строки в sed

Сообщение drBatty »

Nazyvaemykh писал(а):
16.04.2010 15:03
t.t, а если так:
Код
echo -e 'q q q\nq q q' | sed 'N;s/q/w/;s/q/e/;s/q/r/'

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

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

Re: замена строки в sed

Сообщение drBatty »

tmp13 писал(а):
13.04.2010 19:52
Вопрос вообщем то простой есть 2 файла

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

#!/bin/sed -rf

1{
    x
    s/.*/cat date.txt;echo/e
        tl
        :l
    x
}

s/DD\.MM\.YYYY/\r/g
T
G
:begin_loop
    s/([^\n\r]*)\r([^\n]*)\n([^\n]+)\n/\1\3\2\n/
    t begin_loop
h
s/[^\n]*\n//
x
s/\n.*//


Shell

$ ./date.sed zdate.txt Hi 01.04.2004 privet 03.04.2005 LALAL 04.04.2006


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

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

Re: замена строки в sed

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

t.t писал(а):
16.04.2010 13:29
Не совсем понятно, зачем:
просто это общее решение при работе с шаблонами, когда данные должны подставляться не просто по порядку, а в нужном месте.
моему телепатическому блоку представился именно общий подход (вероятно потому, что этим регулярно приходится заниматься) — места замены могут встречаться в произвольном порядке в файле шаблона.

т.е. шаблон

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

Hi date1 privet date2
LALAL date3
даст

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

Hi 01.04.2004 privet 03.04.2005
LALAL 04.04.2006

а шаблон

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

Hi date3 privet date1
LALAL date2
даст

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

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

Re: замена строки в sed

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

sash-kan писал(а):
16.04.2010 21:53
t.t писал(а):
16.04.2010 13:29
Не совсем понятно, зачем:
просто это общее решение при работе с шаблонами, когда данные должны подставляться не просто по порядку, а в нужном месте.
моему телепатическому блоку представился именно общий подход (вероятно потому, что этим регулярно приходится заниматься) — места замены могут встречаться в произвольном порядке в файле шаблона.
Если так, тогда да, конечно. Я как раз не подумал о таком варианте.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: замена строки в sed

Сообщение Nazyvaemykh »

Для «нумерации» неуникальных строк можно использовать какой-то такой скрипт:

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

#!/bin/sed -f

# Скрипт нумерует каждое вхождение подстроки "date" в текстовом файле.
# Предполагается, что символы [ABC] в файле не встречаются.

s/^/0 /;
:begin
s/\n/B/g;
tl;:l;s/date/A/;s/^\([0-9]*\)\(.*\)A/\1\2C\1/;;t label1;
h;s/^[0-9]* //;s/[AC]/date/g;s/B/\n/g;
N;s/.*\n\([^\n]*\)$/\1/;G;s/^\([^n]*\)\n\(.*\)$/\2\n\1/;b begin;
: label1;
s/$/ label2/;b function_inc;: label2;b begin;

:function_inc
t f_inc1;:f_inc1;
s/^\([^ ]*\)0 /\11 /; t function_return
s/ / 9876543210 /;
s/^9* /0&/;
:f_inc2;
/^[0-9]*9 / {s/9\(9*\) /0\1 /;b f_inc2;}
s/\([^ ]\)\(0*\) [0-9]*\(.\)\1[^ ]* /\3\2 /;
b function_return

:function_return
/ label2$/ {s/ label2$//;b label2}

На простых примерах работает…

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

Re: замена строки в sed

Сообщение drBatty »

sash-kan писал(а):
16.04.2010 21:53
просто это общее решение при работе с шаблонами, когда данные должны подставляться не просто по порядку, а в нужном месте.

ну а я сначала подумал, что даты должны вставляться по формату
т.е. вместо DD.MM.YYYY должно вставится 03.06.2005, а вместо HH-YYYY - 17-2006 (17 часов, 2006й год)
в итоге мой скрипт заменяет все форматы на один символ, а уж потом этот символ меняется как надо. Это не частный случай, это другая задача. (хотя я так и не понял, что всё таки было надо)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: