Portál AbcLinuxu, 7. května 2025 12:39

Dotaz: testování předchozího řádku

13.3.2009 20:39 Martin | skóre: 1
testování předchozího řádku
Přečteno: 364×
Odpovědět | Admin
V mém scriptu bych potřeboval za určitých podmínek... na konci předchozího řádku je určitá posloupnost (např 123) a na aktuálním jiná (např 456) a pokud jsou tyto podmínky splněny potřeboval bych aktuální řádek pozměnit (např na 789)... Nevíte někdo jak na to?? v sedu jsem na to doteď nepřišel
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.3.2009 21:10 cronin | skóre: 49
Rozbalit Rozbalit vše Re: testování předchozího řádku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Niekomu asi pri tom zovrie zlc, ale ak potrebujes len nieco jednoduche, tak za predpokladu, ze vstupny subor neobsahuje napr. zavinac, mozno to riesit takto:
[babjak][~/tmp/sed][21:06:27] cat file.txt
abcd
efgh
i123
456j
klmn
o123
456p
qrst
[babjak][~/tmp/sed][21:06:37] cat file.txt | tr '\n' '@' | sed -e 's/@$//' | sed -e 's/123@456/123@678/g' | tr '@' '\n'
abcd
efgh
i123
678j
klmn
o123
678p
qrst
[babjak][~/tmp/sed][21:06:40]
Znak noveho riadku to zmeni za zavinac, sed-om urobi priamociare nahradenie a zavinac prelozi naspat na znak noveho riadku. Urcite by to islo elegantnejsie, ale elegantnost tohto je v tom, ze postacuju uplne zakladne vedomosti tr a sed. :-D
13.3.2009 21:36 cronin | skóre: 49
Rozbalit Rozbalit vše Re: testování předchozího řádku
Odpovědět | | Sbalit | Link | Blokovat | Admin
A kedze sa momentalne zoznamujem s Perlom, zobral som to ako cvicenie a dosiel som k tomuto:
[babjak][~/tmp/sed][21:35:54] cat file.txt
abcd
efgh
i123
456j
klmn
o123
456p
qrst
[babjak][~/tmp/sed][21:36:04] perl -e 'my $file = `cat $ARGV[0]` ; $file =~ s/123\n456/123\n789/g ; print $file;' file.txt
abcd
efgh
i123
789j
klmn
o123
789p
qrst
[babjak][~/tmp/sed][21:36:09]
wamba avatar 14.3.2009 07:00 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: testování předchozího řádku

popřípadě v Perlu něco takového:

perl -pe 's/^456/789/ if $predchoziradek ~~ /123$/;$predchoziradek=$_ ' << file.txt

This would have been so hard to fix when you don't know that there is in fact an easy fix.
14.3.2009 19:02 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: testování předchozího řádku
Až na ten cat je to na začátečníka celkem slušné a efektivní řešení problému! Ten cat nahraďte slurpnutím:
my $file;
{
    local $/ = undef;
    $file = <>;
}
In Ada the typical infinite loop would normally be terminated by detonation.
14.3.2009 19:07 cronin | skóre: 49
Rozbalit Rozbalit vše Re: testování předchozího řádku
To som samozrejme chcel, ale som nevedel rychlo najst ako slurpnut stdin. :-)
14.3.2009 07:44 luky
Rozbalit Rozbalit vše Re: testování předchozího řádku
Odpovědět | | Sbalit | Link | Blokovat | Admin

V sedu zhruba takhle:

sed '/123/ {n; s/456/789/}'

14.3.2009 07:48 cronin | skóre: 49
Rozbalit Rozbalit vše Re: testování předchozího řádku
Chyba tam bodkociarka, ma to byt takto:
sed '/123/ {n; s/456/789/;}'
14.3.2009 09:37 Martin | skóre: 1
Rozbalit Rozbalit vše Re: testování předchozího řádku
Díky moc za pomoc. Když jsem to zkoušel sám tak jsem tam zapoměl dát ty složený závorky proto mi to nefungovalo...
14.3.2009 17:49 luky
Rozbalit Rozbalit vše Re: testování předchozího řádku
Nechyba.
14.3.2009 18:52 cronin | skóre: 49
Rozbalit Rozbalit vše Re: testování předchozího řádku
[babjak][~/tmp/sed][18:50:33] cat file.txt
abcd
efgh
i123
456j
klmn
o123
456p
qrst
[babjak][~/tmp/sed][18:50:34] cat file.txt | sed '/123/ {n; s/456/789/}'
sed: 1: "/123/ {n; s/456/789/}": bad flag in substitute command: '}'
[babjak][~/tmp/sed][18:51:02] cat file.txt | sed '/123/ {n; s/456/789/;}'
abcd
efgh
i123
789j
klmn
o123
789p
qrst
[babjak][~/tmp/sed][18:51:07]
15.3.2009 17:46 Martin | skóre: 1
Rozbalit Rozbalit vše Re: testování předchozího řádku
Tak jsem přišel na jednu zradu ono to funguje jenom dalo by se říct obřádek..

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.