Доброго времени суток!Есть текстовый файл вида:
+ 123
456
789 -
+ 234
567
890 -Нужно объединить все строки между + и -, и получить в результате:
+ 123 456 789 -
+ 234 567 890 -Как это можно сделать? начала изучать sed, но что-то не могу никак тут его применить.
> Как это можно сделать? начала изучать sed, но что-то не могу никак
> тут его применить.sed принципиален? Если нет, то всё просто, но нудно:
$ cat file.txt | perl -ne 'chomp; if(/^\+/) {$s=$_} elsif(/-$/) {print "$s $_\n"; $s=""} elsif($s) {$s.=" $_"} else {print "$_\n"}'
>> Как это можно сделать? начала изучать 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
Вам не кажется, что так будет несколько проще?
>> Как это можно сделать? начала изучать 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}
$ cat file
+ 123
456
789 -
+ 234
567
890 -$ cat file | tr "\n" " " | sed 's/- /-\n/g'
+ 123 456 789 -
+ 234 567 890 -
чисто "чистый" sed ))sed -e :a -e '/[0-9]$/N; s/\n/ /; ta' file
sed -e :a -e '/[-]$/\!N; s/\n/ /; ta' fileкороче, хотел "короче" ))
>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жно.%)
> лучше бы и не начинать... (Жду одобрения от посикс-активистов!).Хотя, часть активистов больше возбудится от
sed ':a /-$/!{N;s/\
/ /;ba}'
>> лучше бы и не начинать... (Жду одобрения от посикс-активистов!).
> Хотя, часть активистов больше возбудится от
> sed ':a /-$/!{N;s/\
> / /;ba}'Мы тут старались-старались, а от топикстартера даже спасибо не дождешься! ;)
>> лучше бы и не начинать... (Жду одобрения от посикс-активистов!).
> Хотя, часть активистов больше возбудится от
> sed ':a /-$/!{N;s/\
> / /;ba}'посоветуйте что почитать надо, чтобы понять, что здесь написано ;)
>> sed ':a /-$/!{N;s/\
>> / /;ba}'
> посоветуйте что почитать надо, чтобы понять, что здесь написано ;)Чтобы _понять, нужно _работать головой, а не читать (в широком/простом смысле~).
Ну, man sed почитай, прикладывая прочитанное к выше написанному.3 подхода по 10. Каждый день. ...До наступления понимания. Но я ничего не гарантировал.
>> Хотя, часть активистов больше возбудится от
>> 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
> А во-вторых, по поводу "s/\n/": работа с символами перевода строки в _sed-е
> это такой _страшный тёмный лес (vs версии*реализации), что лучше бы и
> не начинать... (Жду одобрения от посикс-активистов!).Воистину акбар! :-)
> Как это можно сделать? начала изучать sed, но что-то не могу никак
> тут его применить.Признайся, ты - бородатый админ, ради лулзов прикидывающийся лицом женского пола :)