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.conf
a 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.htaccess
soubory.Například:V níže uvedeném kódu z
httpd.conf
potř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!