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.
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 как вкладку?
Похоже, вам нужен поиск , чтобы включить предыдущую строку, но не заменить. Таким образом, вы можете найти первую строку шаблона, а затем использовать команду 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