Portál AbcLinuxu, 16. července 2025 06:09
Hledany retezec: "cc" pridat radek: "xx" Vstupni data: aabbccddeeff aaaaaaaaaaaa aaabbbcccddd cccccccccccc aaaaaaaaaaaa aabbccbbbbbb xxxxxxxxxxxx Vystupni data: aabbccddeeff aaaaaaaaaaaa aaabbbcccddd cccccccccccc aaaaaaaaaaaa aabbccbbbbbb xx xxxxxxxxxxxxManualove 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.
$ sed '/cc/ a\xx' vstupni_data aabbccddeeff xx aaaaaaaaaaaa aaabbbcccddd xx cccccccccccc xx aaaaaaaaaaaa aabbccbbbbbb xx xxxxxxxxxxxxZa kazdy riadok kde je cc vypise xx
grep
em 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
perl -0ne "s/cc(.*\n)(?\!cc)(.*)$/cc\1xx\n\2/g; print" < vstup.txt
perl -0ne "s/(cc.*\n)(?\!cc)(.*)$/\1xx\n\2/; $_" < vstup.txt
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é.
tac
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.