Zde je otázka od našeho pravidelného čtenáře pana Rajana. Chce použít Sed pro vyhledání a nahrazení řádku mezi rozsahy vzorů. No, tady je jeho otázka.
Psal jsem shell skript pro automatizaci několika úloh na VPS. Například jsem chtěl upravit
httpd.confa nahraďte"AllowOverride None" to "AllowOverride All"který se nachází v konkrétním<Directory "/var/www/html">. Cílem je nahradit pouze řádek v tomto konkrétním bloku, aniž by to ovlivnilo ostatní bloky (ve skutečnosti je jich mnoho, ale mám obavy z bloku, který obsahuje "/var/www/html"). Důvod, proč jsem to chtěl udělat, je, že jsem měl potíže s konfigurací Apache tak, aby umožňoval přepisy z.htaccesssoubory.Například:V níže uvedeném kódu z
httpd.confpotřebuji vyhledat vzor<Directory "/var/www/html">a nahraďte AllowOverride None pomocí AllowOverride All umístěn v této adresářové struktuře bez ovlivnění jiné adresářové struktury.<Directory "/var/www/html"> AllowOverride None </Directory>Prosím, pomozte mi.
Použití Sed k vyhledání a nahrazení řádku mezi rozsahy vzorů
Zdá se, že toto je úkol pro sed , jako sed podporuje rozsahy vzorů v tomto tvaru:
sed '/startpattern/,/endpattern/ <sed-commands>' file
Takže podle Rajanových požadavků musíme vyhledat počáteční vzor <Directory "/var/www/html"> , koncový vzor </Directory> a najděte "AllowOverride None" and replace it with "AllowOverride all" . Chcete-li to provést, sed příkaz by měl být použit, jak je uvedeno níže.
#sed -i '/<Directory "\/var\/www\/html">/,/<\/Directory>/ s/AllowOverride None/AllowOverride all/' httpd.conf
Zde -i možností je upravit soubory na místě. Pokud nepoužijete možnost -i , pak bude upravený výstup vytištěn na stdout a soubor by se nezměnil!