Portál AbcLinuxu, 16. července 2025 06:09


Dotaz: Sed - za posledni shodou pridat radek

24.9.2007 15:56 artec | skóre: 24
Sed - za posledni shodou pridat radek
Přečteno: 584×
Odpovědět | Admin
Dobry den, pomoci regularnich vyrazu v sedu bych potreboval vyresit tento problem.

Priklad:
Hledany retezec: "cc"
pridat radek: "xx"

Vstupni data:

aabbccddeeff
aaaaaaaaaaaa
aaabbbcccddd
cccccccccccc
aaaaaaaaaaaa
aabbccbbbbbb
xxxxxxxxxxxx

Vystupni data:

aabbccddeeff
aaaaaaaaaaaa
aaabbbcccddd
cccccccccccc
aaaaaaaaaaaa
aabbccbbbbbb
xx
xxxxxxxxxxxx
Manualove stranky sedu i sadu techto prikladu znam, ale stale s tim nemuzu hnout. Zatim vsechny me pokusy jsou ve vysledku temer stejne jako kdybych zadal jenom:

# sed -e "/cc/ a\xx" ./vstupni_data

Za kazde rady dekuji.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.9.2007 17:33 ajikdpoe | skóre: 23 | blog: dvh
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
Odpovědět | | Sbalit | Link | Blokovat | Admin
mne to funguje:
$ sed '/cc/ a\xx' vstupni_data 
aabbccddeeff
xx
aaaaaaaaaaaa
aaabbbcccddd
xx
cccccccccccc
xx
aaaaaaaaaaaa
aabbccbbbbbb
xx
xxxxxxxxxxxx
Za kazdy riadok kde je cc vypise xx
24.9.2007 17:40 artec | skóre: 24
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
Asi jsem dotaz mozna napsal nesrozumitelne, ale potrebuji az za poslednim vyskytem "cc" v celem vstupnim souboru vlozit radek s "xx", tak, aby byl vysledek totozny s tim, jak jsem psal v dotazu.
24.9.2007 18:15 Martin Doucha | skóre: 23 | blog: Yet another blog
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
Já bych na to použil AWK, načetl si celý vstup do paměti, průběžně si pamatoval konec řádku s posledním výskytem hledaného řetězce, na konci vložil xx na správné místo a všechno vypsal.
24.9.2007 18:32 petr
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
A co grepem zjistit číslo poslední řádky a pak jen "poskládat" příkazy head a tail???

Příklad:
grep -n pattern input_file | tail -n 1 | sed 's/\([0-9]*\).*/\1/'
vypíše číslo poslední řádky, která odpovídá.

Pak jen stačí:
LAST_LINE=`grep -n pattern input_file | tail -n 1 | sed 's/\([0-9]*\).*/\1/'`

TAIL=`wc -l input_file | sed 's/\([ 0-9]*\).*/\1/'`
TAIL=$(($TAIL - $LAST_LINE))

head -n $LAST_LINE input_file > output_file
echo náhrada >> output_file
tail -n $TAIL input_file >> output_file
zoul avatar 24.9.2007 19:11 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
Jestli se nemusíme držet sedu, tak v Perlu by to mohlo vypadat takhle:
perl -0ne "s/cc(.*\n)(?\!cc)(.*)$/cc\1xx\n\2/g; print" < vstup.txt
zoul avatar 24.9.2007 19:14 zoul | skóre: 43 | blog: | Boskovice
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
A nebo ještě o fous kratší, golfu se nedá odolat :)
perl -0ne "s/(cc.*\n)(?\!cc)(.*)$/\1xx\n\2/; $_" < vstup.txt
24.9.2007 20:16 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek

Lze to napsat i jinak - je to kratší a mnohem míň srozumitelný :-):

sed "`grep -n 'regexp' <vstupní-soubor | \
   tail -n 1 | cut -d: -f 1`apřidávaný řádek" \
   <vstupní-soubor

Myslím, že by to šlo napsat i čistě v sedu (třeba příkazem N si celý soubor načíst do paměti a pak to nějak vyhledat (nebo třeba přetočit (2×) pořadí řádku a dávat před první výskyt), ale tohle bude určitě paměťově míň náročné.

I am always ready to learn although I do not always like to be taught. (W. Churchill)
24.9.2007 20:29 artec | skóre: 24
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
Uz mi to funguje asi 5ti zpusoby. :)

Dekuji vsem mnohokrat za rady (nakopnuti). Honza
24.9.2007 22:41 huhuhu
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
1) aj ked je uz problem vyrieseny ...
2) ... a nie som ziadny expert na sed

... tak predsa len - neexistuje nejaky prepinac REVERSE ?
ja by som na to isiel opacne - najst prvy vyskyt od konca suboru a ten spracovat :-)
24.9.2007 23:13 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Sed - za posledni shodou pridat radek
tac

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.