Portál AbcLinuxu, 10. května 2025 05:03
mam zdroj, napr.: a, b c, d a chci nahradit ",$" za " " abych dostala a b c d pomoci sedu mi to nejde. Poradite prosim nekdo?
perl -ne 's/,\n/ /; print;'
), ale ze zajimavosti jsem se zeptal googlu a hned druhy odkaz navede na prikaz sed '/,$/N;s/,\n */ /'
. man seda přečíst si pasáž o příkazech. Určitě se Ti tam nějaké zalíbí, pomocí kterých to vyřešíš. Popřípadě si něco vůbec o sedu přečti, jak pracuje pattern space, hold space a další fičurky. Já v sedu běžně nedělám, tak jsem s pomocí manu vypotil tohle:
sed -n ': start;/,$/{N;s/,\n/ /;b start};p'Ale netvrdím, že je to takhle elegantní. Hlavně si, to zas prosím já, najdi, co znamenají jednotlivé příkazy (speciálně N), ať nemám pocit, že jsem zmařil čas.
a, b, c a b c
Na každém vstupním řádku nahraď čárku, která je poslední znak na řádce, mezerouCož tedy zoufale neodpovídá zadání. 1. $ není znak (ve smyslu skutečné sekvence bytů) konce řádku, pouze matchuje s koncem vstupního řetezce. S jistým humorem řečeno, těžko můžeš smazat konec něčeho. To by šlo udělat jedině tak, že by jsi to nafoukla na nekonečnou délku. 2. I kdyby byl $ znak konce řádku, tak vycházíš ze špatného předpokladu, že po přečtení vstupního řádku do pattern spacu je tento ukončen tímto znakem, což není. Například si to můžeš ověřit tak, že
sed 's/.*//', což znamená smazání VŠECH znaků na řádce, vypíše prázdný řádek a nikoli nic. Můžeš to chápat třeba tak, že sed zpracovává vstupní soubor po řádcích, ale do samotného pattern spacu znaky konce řádku nedává. A pak když to znovu tiskne, tak automaticky odřádkuje. ÁÁÁle použití N, to je jiná. Tohle chování se může zdát možná trošku nelogické, nicméně sama nahlídneš, že jinak by to dělalo ještě větší bordel.
rychly nástřel (= neodladěný)
:loop
$!{ N ; b loop }
s/,\n/ /g
základním kamenem je příkaz "N" - akumulace řádků, aby se řádky vůbec daly spojovat
sed ':start;/,$/{N;s/,\n/ /;b start}'
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.