Portál AbcLinuxu, 12. května 2025 01:09
Zdravim,
poradil byste nekdo prosim jak pomoci sedu smazu vsechny nove radky? Vim ze by to slo udelat pomoci tr mnohem jednoduseji, ale chtel bych vedet jak na to v sedu.
Teprve dneska jsem se dozvedel ze existuje neco jako hold space, ale vubec me to neposloucha
sed '/^$/d'
sed -ne '1{h;n;} H ${g;s#\n# #g;p;}'
Omlouvam se za spatnou formulaci dotazu
To co chci je zkratka vymazat vsechny vyskyty "\n" ... tedy by mela vzniknout jedna dlouha radka, kterou dale budu parsovat.
sed -ne '1{h;n;}
H
${g;s#\n# #g;p;}'
Zda se, ze toto pracuje, jak bych chtel, dekuji mnohokrat. Mohl byste prosim jeste vysvetlit jak to funguje? Neni mi jasne kdy a proc nastava okamzik ze mohu pouzit s/\n/ /g, ktery bezne nefunguje.
H
bez rozlišení řádku je tam proto, abyste nezačal celý "hold space" prázdným řádkem.
Třetí řádek se provede až u poslední položky na vstupu. Po přidání řádku do "hold spacu" si pomocí g
vložíte vše, co jste si odložil do aktuálně zpracovávaného prostoru, nahradíte ty nové řádky (s
) a výsledek vytisknete (p
).
Jde to i bez "hold space" použitím příkazů pro práci s více řádky, ale když už jste je zmiňoval, tak proč je neukázat v praxi. ;)
g
/x
(a svým způsobem G
) zpracováváte to, co bylo do teď uloženo v "hold space". Když to bylo více naakumulovaných řádků, tak je máte na talíři všechny včetně "new line" mezi nimi.
$ sed --version GNU sed version 4.1.5 Copyright (C) 2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, to the extent permitted by law. $ sed --version | sed ':a ${s/\n//g;t;};N;ba' GNU sed version 4.1.5Copyright (C) 2003 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,to the extent permitted by law.
awk '/^$/{while (match($0,/^$/) && getline);print ""};/./{print}'
sed -ne '1{h;n;} H ${g;s#\n\n\n*#\n\n#g;p;}'
Děkuji všem za rady, už to chápu ... nicméně mám daší problém ;) Na vstupu mám text, jež je (logicky) rozdělen do určitých bloků (každý blok končí řádkem na němž je pouze "."). A já bych chtěl, pomocí sedu tyto bloky vypsat odzadu - poslední, předposlední, ... (pořadí řádků v blocích se nemění). Nevíte někdo prosím, kde je chyba?
#!/usr/bin/sed -f N /^\.$/{x;H} ${x;p}
Skript spouštím s parametrem -n ... na výstupu se nic neobjěví ;(
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.