Sed gebruiken om meerregelige strings in het apache2.conf-bestand te vervangen

Als onderdeel van mijn Bash-serverinstallatiescript, probeer ik de standaard apache www-website te vergrendelen.

Ik wil dit converteren:

<Directory /var/www>
      Options Indexes FollowSymLinks

Hiernaar:

<Directory /var/www>
      Options -Indexes -FollowSymLinks -ExecCGI

Sinds Opties Indexen FollowSymLinks wordt meerdere keren genoemd in het bestand, ik moet zoeken en vervangen om de vorige regel op te nemen.

Ik heb het onderstaande sed commando geprobeerd, met behulp van backslash om aan schuine strepen te ontsnappen, maar het vervangt niets:

cat /etc/apache2/apache2.conf | sed 's/[<Directory \/var\/www\/>]\n   Options Indexes FollowSymLinks/[<Directory \/var\/www\/>]\n     Options -Indexes -FollowSymLinks -ExecCGI/;P;D'

Ik heb geprobeerd dingen tussen aanhalingstekens en vierkante haken te zetten. De opdracht lijkt de tabbladen ook niet leuk te vinden.

Alle ideeën worden op prijs gesteld.

1
задан 17 December 2020 в 12:46

2 ответа

sed по умолчанию работает с каждой строкой отдельно, поэтому вы не можете использовать \ n . Если вы хотите работать с несколькими строками, вы можете использовать флаг -z , который разделяет строки символами NUL и позволяет использовать \ n .

Кроме того, вы не нужно перенаправлять вывод cat в sed , так как sed может читать файлы самостоятельно.

Кроме того, использование необязательно / в качестве разделителя в вашей команде sed , так как sed принимает и другие разделители. Использование другого разделителя в вашем случае дает то преимущество, что вам не нужно экранировать каждые / с помощью обратной косой черты ( \ ).

Итак, вам нужно выполнить следующую команду:

sed -z 's|<Directory /var/www>\n\tOptions Indexes FollowSymLinks|<Directory /var/www>\n\tOptions -Indexes -FollowSymLinks -ExecCGI|' /etc/apache2/apache2.conf

Обратите внимание, что в приведенной выше команде я использовал \ t в качестве символа табуляции. Однако не все версии sed принимают \ t в качестве символа табуляции. Если приведенная выше команда не работает для вас, вы можете заменить \ t буквенной вкладкой в ​​своем терминале, нажав Ctrl + V , а затем нажав ] Tab или используйте другой метод из этого вопроса о переполнении стека: Почему sed не распознает \ t как вкладку?

0
ответ дан 3 January 2021 в 22:46

Похоже, вам нужен поиск , чтобы включить предыдущую строку, но не заменить. Таким образом, вы можете найти первую строку шаблона, а затем использовать команду n для загрузки строки n ext, которую затем можно обработать обычным способом либо с помощью s ubstitute

sed '\:<Directory /var/www>:{
     n
     s/Options Indexes FollowSymLinks/Options -Indexes -FollowSymLinks -ExecCGI/
  }' file

или c подвешивание всей линии

sed '\:<Directory /var/www>:{
     n
     c\      Options -Indexes -FollowSymLinks -ExecCGI
  }' file
0
ответ дан 3 January 2021 в 22:46

Другие вопросы по тегам:

Похожие вопросы: