Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: DuckD 18 Února 2013, 13:29:14

Název: SED - výpis stringu mezi prvním výskytem slova a následující mezerou
Přispěvatel: DuckD 18 Února 2013, 13:29:14
Ahoj, prosím o pomoc s výpisem stringu mezi prvním výskytem slova a následující první mezerou, příklad:
Citace
Jedna dva tři

Tady je text a je nějak dlouhý
    chroust - je to živočich co chroustá
               - chroustá si, ale jednou dochroustá

Tady je text už po mezeře... atd

Chtěl bych aby se vypsalo:
Citace
    chroust - je to živočich co chroustá
               - chroustá si, ale jednou dochroustá

Zkoušel jsem na to takto:
Kód: [Vybrat]
line=$(cat text.txt | sed -n '/ chroust -/,/^$/p')
echo $line

Ale nefunguje to.. Nevím si rady, prosím o pomoc. Nemusí to být zrovna v SEDu. Dík!
Název: Re:SED - výpis stringu mezi prvním výskytem slova a následující mezerou
Přispěvatel: ntz_reloaded 18 Února 2013, 13:41:48
Kód: [Vybrat]
sed '/$start_mark/,/$end_mark/!d' /soubor
priklad:

Kód: [Vybrat]
# cat /etc/passwd;
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
avahi:x:103:104:User for Avahi:/var/run/avahi-daemon:/bin/false
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
ftp:x:40:49:FTP account:/srv/ftp:/bin/bash
games:x:12:100:Games account:/var/games:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
messagebus:x:100:101:User for D-Bus:/var/run/dbus:/bin/false
news:x:9:13:News system:/etc/news:/bin/bash
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
ntp:x:74:105:NTP daemon:/var/lib/ntp:/bin/false
postfix:x:51:51:Postfix Daemon:/var/spool/postfix:/bin/false
root:x:0:0:root:/root:/bin/bash
sshd:x:101:102:SSH daemon:/var/lib/sshd:/bin/false
statd:x:104:65534:NFS statd daemon:/var/lib/nfs:/sbin/nologin
usbmux:x:102:65534:usbmuxd daemon:/var/lib/usbmuxd:/sbin/nologin
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
dpecka:x:1000:100:dpecka:/home/dpecka:/bin/bash
radvd:x:105:2:Router ADVertisement Daemon for:/var/lib/empty:/bin/false

z etc/passwd vypisu jen uzivatele mezi mail a root:

Kód: [Vybrat]
# sed '/^mail/,/^root/!d' /etc/passwd
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
messagebus:x:100:101:User for D-Bus:/var/run/dbus:/bin/false
news:x:9:13:News system:/etc/news:/bin/bash
nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash
ntp:x:74:105:NTP daemon:/var/lib/ntp:/bin/false
postfix:x:51:51:Postfix Daemon:/var/spool/postfix:/bin/false
root:x:0:0:root:/root:/bin/bash
Název: Re:SED - výpis stringu mezi prvním výskytem slova a následující mezerou
Přispěvatel: DuckD 18 Února 2013, 14:34:06
Já ale potřebuju vypsat string mezi prvním výskytem slova a následujícím výskytem prázdné řádky. V SEDu mi prostě nefuguje nalezení prázdné řádky - ^$
Našel jsem toto:
Kód: [Vybrat]
sed '/^$/q' # deletes everything after first blank line
Takže ve výsledku jsem to přečůral takto:
Kód: [Vybrat]
cat text.txt | sed -n '/ chroust -/,/^$/p' | sed '/^$/q'
Myslím že to jde i jednodušeji, ale je to hodně složité...
Docela dobrá stránka zde:
http://www-rohan.sdsu.edu/doc/sed.html (http://www-rohan.sdsu.edu/doc/sed.html)
Název: Re:SED - výpis stringu mezi prvním výskytem slova a následující mezerou
Přispěvatel: pacholik 18 Února 2013, 15:55:59
Mě to teda funguje. Co dostaneš ty bez toho q?
Kód: [Vybrat]
cat text.txt | sed -n '/ chroust -/,/^$/p'
Název: Re:SED - výpis stringu mezi prvním výskytem slova a následující mezerou
Přispěvatel: GdH 18 Února 2013, 16:49:36
GNU sed by to měl zvládnout takto:

Kód: [Vybrat]
sed -n '/ chroust /,/^$/{/^$/d;p}'
Pokud se počítá jen s jedním výskytem:

Kód: [Vybrat]
sed -n '/ chroust /,/^$/{/^$/q;p}'
Název: Re:SED - výpis stringu mezi prvním výskytem slova a následující mezerou
Přispěvatel: DuckD 19 Února 2013, 09:53:31
To je přesně ono co potřebuju GdH, Dík!  :)