URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9533
[ Назад ]

Исходное сообщение
"Объединение строк bash"

Отправлено AnnaBokova , 31-Авг-12 17:18 
Доброго времени суток!

Есть текстовый файл вида:

+ 123
456
789 -
+ 234
567
890 -

Нужно объединить все строки между + и -, и получить в результате:
+ 123 456 789 -
+ 234 567 890 -

Как это можно сделать? начала изучать sed, но что-то не могу никак тут его применить.



Содержание

Сообщения в этом обсуждении
"Объединение строк bash"
Отправлено XAnder , 31-Авг-12 19:35 
> Как это можно сделать? начала изучать sed, но что-то не могу никак
> тут его применить.

sed принципиален? Если нет, то всё просто, но нудно:

$ cat file.txt | perl -ne 'chomp; if(/^\+/) {$s=$_} elsif(/-$/) {print "$s $_\n"; $s=""} elsif($s) {$s.=" $_"} else {print "$_\n"}'


"Объединение строк bash"
Отправлено ДорогойДрук , 01-Сен-12 00:28 
>> Как это можно сделать? начала изучать sed, но что-то не могу никак
>> тут его применить.
> sed принципиален? Если нет, то всё просто, но нудно:
>
$ cat file.txt | perl -ne 'chomp; if(/^\+/) {$s=$_} elsif(/-$/) {print "$s 
> $_\n"; $s=""} elsif($s) {$s.=" $_"} else {print "$_\n"}'

ООО да, пёрл здесь очень кстати :)

cat file.txt | tr -d "\n" | sed s/-/-"\n"/g
Вам не кажется, что так будет несколько проще?


"Объединение строк bash"
Отправлено anonymous , 01-Сен-12 13:53 
>> Как это можно сделать? начала изучать sed, но что-то не могу никак
>> тут его применить.
> sed принципиален? Если нет, то всё просто, но нудно:
>
$ cat file.txt | perl -ne 'chomp; if(/^\+/) {$s=$_} elsif(/-$/) {print "$s 
> $_\n"; $s=""} elsif($s) {$s.=" $_"} else {print "$_\n"}'

Perl принципиален? Если нет, то:


#!/usr/bin/expect --
log_user 0
spawn bash
set outfile {}
expect "\\$" {exp_send -- "cat file.txt\n"}
expect {
    "\\$" {}
    -re "\n(\\+.*-)+?" {lappend outfile $expect_out(1,string); exp_continue}
}
set outfile [string map {\r "" \n " "} $outfile]
foreach list $outfile {puts stdout $list}


"Объединение строк bash"
Отправлено allez , 01-Сен-12 15:53 

$ cat file
+ 123
456
789 -
+ 234
567
890 -

$ cat file | tr "\n" " " | sed 's/- /-\n/g'
+ 123 456 789 -
+ 234 567 890 -


"Объединение строк bash"
Отправлено михалыч , 01-Сен-12 19:04 
чисто "чистый" sed ))
sed -e :a -e '/[0-9]$/N; s/\n/ /; ta' file


"Объединение строк bash"
Отправлено михалыч , 02-Сен-12 06:57 
sed -e :a -e '/[-]$/\!N; s/\n/ /; ta' file
короче, хотел "короче" ))

"Объединение строк bash"
Отправлено Andrey Mitrofanov , 02-Сен-12 13:10 
>
sed -e :a -e '/[-]$/\!N; s/\n/ /; ta' file
короче, хотел "короче" ))

Во-первых, "[-]$" -> "-$".

А во-вторых, по поводу "s/\n/": работа с символами перевода строки в _sed-е это такой _страшный тёмный лес (vs версии*реализации), что лучше бы и не начинать... (Жду одобрения от посикс-активистов!).

В-третьих, про короче: -e -e не нужен, "\!" не едет! sed ':a /-$/!N;s/\n/ /;ta'

В-четвёртых, я б предпочёл написать ':a /-$/!{N;s/\n/ /g;ba}'

В-пятых, проверив с не "-"-данными перед "+", добавил бы ':a /^\+/{/-$/!{N;s/\n/ /;ba}}' ...

...но это уж точно ником не нуд^Hжно.%)


"Объединение строк bash"
Отправлено Andrey Mitrofanov , 02-Сен-12 13:20 
> лучше бы и не начинать... (Жду одобрения от посикс-активистов!).

Хотя, часть активистов больше возбудится от

sed ':a /-$/!{N;s/\
/ /;ba}'


"Объединение строк bash"
Отправлено anonymous , 07-Сен-12 09:10 
>> лучше бы и не начинать... (Жду одобрения от посикс-активистов!).
> Хотя, часть активистов больше возбудится от
> sed ':a /-$/!{N;s/\
> / /;ba}'

Мы тут старались-старались, а от топикстартера даже спасибо не дождешься! ;)


"Объединение строк bash"
Отправлено richit , 11-Окт-12 17:49 
>> лучше бы и не начинать... (Жду одобрения от посикс-активистов!).
> Хотя, часть активистов больше возбудится от
> sed ':a /-$/!{N;s/\
> / /;ba}'

посоветуйте что почитать надо, чтобы понять, что здесь написано ;)


"Объединение строк bash"
Отправлено Andrey Mitrofanov , 12-Окт-12 11:40 
>> sed ':a /-$/!{N;s/\
>> / /;ba}'
> посоветуйте что почитать надо, чтобы понять, что здесь написано ;)

Чтобы _понять, нужно _работать головой, а не читать (в широком/простом смысле~).
Ну, man sed почитай, прикладывая прочитанное к выше написанному.

3 подхода по 10. Каждый день. ...До наступления понимания. Но я ничего не гарантировал.


"Объединение строк bash"
Отправлено pavlinux , 24-Окт-12 02:19 
>> Хотя, часть активистов больше возбудится от
>> sed ':a /-$/!{N;s/\/ /;ba}'
> посоветуйте что почитать надо, чтобы понять, что здесь написано ;)

http://www.regular-expressions.info/

Mastering Regular Expressions  http://shop.oreilly.com/product/9780596528126.do
Introducing Regular Expressions http://shop.oreilly.com/product/0636920012337.do
Regular Expressions Cookbook http://shop.oreilly.com/product/0636920023630.do


"Объединение строк bash"
Отправлено allez , 02-Сен-12 14:51 
> А во-вторых, по поводу "s/\n/": работа с символами перевода строки в _sed-е
> это такой _страшный тёмный лес (vs версии*реализации), что лучше бы и
> не начинать... (Жду одобрения от посикс-активистов!).

Воистину акбар! :-)


"Объединение строк bash"
Отправлено Anonim , 11-Окт-12 22:26 
> Как это можно сделать? начала изучать sed, но что-то не могу никак
> тут его применить.

Признайся, ты - бородатый админ, ради лулзов прикидывающийся лицом женского пола :)