Portál AbcLinuxu, 10. května 2024 11:59


Dotaz: Vim vložit rádek na určitou pozici v souboru

29.4.2019 12:57 Jack Hokus | skóre: 34 | blog: LostHeaven
Vim vložit rádek na určitou pozici v souboru
Přečteno: 311×
Odpovědět | Admin
Ahoj,

potřeboval bych poradit. Mám webovou stránku, která obsahuje menu, které je dělané jako klasický seznam, tento seznam obsahuje každá stránka.

Když potřebuji přidat nebo odebrat nějakou položku v menu, musím menu editovat na všech stránkách.

Chtěl bych se zeptat, jak by to šlo udělat ve VIMu najdednou. Něco se mi podařilo najít.

Takto lze otevřít všechny soubory s příponou .html - :n ./**.html. Nahrazení textu by se dalo udělat třeba takto - :bufdo %s/Windows/linux/.

Poznámka:Tento příklad je jen ilustrační, vytvořil jsem si dva soubory v obou řádek textu a nahradil jsem slovo Windows slovem Linux.

Děkuji

Petr

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

Odpovědi

29.4.2019 14:12 finn | skóre: 43 | blog: finnlandia | 49° 44´/13° 22´
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Řekl bych, že používáš špatné kladivo. Na tyhle úkoly se hodí líp třeba sed nebo perl.
Užívej dne – možná je tvůj poslední.
29.4.2019 19:18 ed
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
vim (v příkazovém režimu) je v podstatě ed (resp. ex) a tím pádem jako sed. Tzn. řádek vložíme příkazem a. Lze kombinovat s bufdo:
:a2
test
.
vloží text / řádek:

test
za druhý řádek v souboru.
:/pokus/
test
.
udělá totéž za (prvním od aktulální pozice) řádkem obsahujícím pokus
29.4.2019 14:21 debian+
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Musi to byt vo vim? Tu mas v php (neosetruje chyby, okrem ak nenajde subory, nerobi nic):
html subor (nutne minimum pre kod):
<header>
	<ul>
		<li>jeden</li>
		<li>dva</li>
		<li>dva</li>
	</ul>
</header>
PHP kod:
<?

define("CESTA_K_PRIECINKU", ".");

function najdi_vsetky_subory()
{
	$cesta=CESTA_K_PRIECINKU;
	$subory=`find $cesta -name "*.html"`;
	$subory_pole=explode("\n", $subory);
	unset($subory_pole[count($subory_pole)-1]);
	
	return $subory_pole;
}

function prida_polozku_menu($path_file, $html_item)
{
	$html=file_get_contents($path_file);
	
	/* hlada koniec menu v header */
	$poz=strpos($html, '<header');
	$poz=strpos($html, "\n\t</ul",$poz); /* hlada ul so zac. riadku */
	
	/* vytvara novy subor v pamety */
	$subor=substr($html, 0, $poz);
	$subor.=$html_item;
	$subor.=substr($html, $poz);
	
	file_put_contents($path_file, $subor);
}

function odobere_polozku_menu($path_file, $html_item)
{
	$html=file_get_contents($path_file);
	
	/* hlada koniec menu v header */
	$html=str_replace($html_item, '', $html);
	
	file_put_contents($path_file, $html);
}

$subory_cesta=najdi_vsetky_subory();
foreach($subory_cesta as $subor_cesta)
{
	echo $subor_cesta."\n";
	
	// ukazka pridania
	prida_polozku_menu($subor_cesta, "\n\t\t<li>pridane</li>");
	
	// ukazka odobratia
	odobere_polozku_menu($subor_cesta, "\t\t<li>jeden</li>\n");
}
?>
29.4.2019 17:05 debian+
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
vložit rádek na určitou pozici v souboru
<?php

/*
 * kladne cislo  - od zaciatku
 * kladne cislo neexistuje pozicia - prida na koniec
 * 0 - prida na koniec
 * zapocne cislo - prida od konca 
 * zapocne cislo neexistuje pozicia - neurobi nic
 */
function pridaj_riadok($path, $position, $line)
{
	$riadky=file($path);
	$pocet=count($riadky);
	
	if($position < (-$pocet))
		return;
	if($position < 0)
		$index=$pocet+$position-1;
	else
		if($position == 0 || $position > $pocet)
		{
			$index=$pocet;
			$riadky[$index]=$line."\n";
			goto preskoc;
		}
		else
			$index=$position-2;

	$riadky[$index].=$line."\n";
preskoc:
	
	file_put_contents($path, $riadky);
}

// pridaj_riadok('bla.html', 0, '<p>!!!</p>');

?>
29.4.2019 17:15 pavele
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
:args ./*.html

:argdo set ff=unix|w
29.4.2019 20:21 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přesně kvůli tomu byly vyvinuty skriptovací jazyky, například PHP. Mohou generovat HTML či jiné formáty on-line či off-line. Stačí udržovat jeden soubor s menu a při jeho modifikaci vygenerovat novou sadu HTML.

Nejraději na tohle používám XSLT, protože za mne řeší dost věcí lépe než různé frameworky a je to mnohem rychlejší. Menu, data i slovníky stačí udržovat v XML.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Josef Kufner avatar 29.4.2019 21:10 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Správné řešení je navštívit https://www.staticgen.com/, vybrat si generátor statických webů a použít ten.

Jinak koukni na ed (nikoliv sed) a napiš si pro něj skript. Stejné příkazy jdou použít i ve vimu. V dokumentaci ed (info ed) hledej "Line addressing" a "Commands".

Trochu lepší řešení je umístit si do souboru značky (HTML komentáře na samostatné řádky) a mezi ně skriptem vkládat soubor s menu (a předtím odstranit starý obsah).
Hello world ! Segmentation fault (core dumped)
k3dAR avatar 29.4.2019 22:41 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: Vim vložit rádek na určitou pozici v souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
# nahrazeni Windows za linux
sed 's/Windows/linux/' -i *.html

# nahrazeni vsech vyskytu (v kazdem radku)
sed 's/Windows/linux/g' -i *.html

# pridani radku "linux", nad radek zacinajici "Windows"
sed 's/^Windows/Linux\nWindows/' -i *.html

# pridani radku "linux", nad radek obsahujici jen slovo "Windows"
sed 's/^Windows$/Linux\nWindows/' -i *.html
porad nemam telo, ale uz mam hlavu... nobody

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.