GNU/Linux >> Znalost Linux >  >> Linux

Pomocí Sed k vyhledání a nahrazení čáry mezi rozsahy vzorů

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!


Linux
  1. Shoda víceřádkového vzoru pomocí Sed, Awk nebo Grep?

  2. Jak získat počet souborů v adresáři pomocí příkazového řádku?

  3. Najít číslo řádku, které obsahuje vzor, ​​pomocí vlastního oddělovače regulárního výrazu?

  1. Extrahovat hodnotu mezi dvěma vyhledávacími vzory na stejném řádku?

  2. Může Sed nahradit nové řádkové znaky?

  3. Nahradit rozsah řádků rozsahem řádků (sed nebo jiné)?

  1. Jak nahradit text podobný sedu pythonem?

  2. Použití grep a sed k nalezení a nahrazení řetězce

  3. Najít a nahradit sed v adresáři a podadresářích