따라서 디렉터리에 여러 개의 파일이 있고 각 파일에 텍스트 줄을 삽입해야 합니다. 기본적으로 다음과 같은 형식을 갖습니다.
<VirtualHost *:80>
ServerAdmin gabe@localhost
DocumentRoot /var/www/test1
ServerName test1.local
ServerAlias test1
<Directory "/var/www/test1">
Options All
AllowOverride All
</Directory>
</VirtualHost>
끝 앞에 행을 삽입하고 싶습니다.
</가상호스트>상표. 나의 첫 번째 가정은 sed를 사용하여 태그를 일치시키고 교체할 수 있어야 한다는 것이었습니다. 지금부터 시도해 볼 예정이지만, 누군가 이 작업을 수행할 수 있는 기존 방법이 있다면 이에 대해 듣고 싶습니다.
답변1
이 같은:
sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'
일하다. 여러 파일에 대해 이 명령을 반복하려면 다음을 수행할 수 있습니다.
for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done
@ChrisDown에게 감사드립니다. 아마도 더 좋을 것입니다(그러나 테스트되지는 않음).
find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\
done
답변2
Perl을 사용해도 괜찮다면 다음을 시도해 보세요.
perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile
이 -i
스위치는 이전 파일을 확장자로 저장 .old
하고 현재 파일로 인쇄합니다.
답변3
편집하려는 내용이 다소 복잡한 경우 "ex"(명령줄 vi)를 사용할 수도 있습니다. 예를 들어, "" 인스턴스를 하나만 삽입하려고 합니다.
다음과 같은 쉘 스크립트가 작동합니다.
for FILENAME in *.whatever # Need a criteria to glob, or a list of names
do
ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done
이 접근 방식은 신중하게 설계된 패턴으로 위치를 찾고 "커서 이동"을 수행하는 "ex"의 장점을 제공합니다. 패턴을 찾은 후 다음 인스턴스를 찾은 다음 삽입을 수행하는 등의 작업을 수행할 수 있습니다. 또는 텍스트를 삽입하는 대신 텍스트를 변경할 수도 있습니다. 또는 범위 간에 변경할 수 있습니다. "ex"를 사용하면 "."을 사용할 수 있다는 점을 잊지 마세요. 현재 줄이므로 .,/^somepatter/s/blah/foo/ 작동합니다.
답변4
다음 한 줄의 코드를 사용하여 파일의 특정 위치(이 경우 "VirtualHost" 앞)에 한 줄 또는 여러 줄을 삽입할 수 있습니다. 코드는 기본적으로 지정된 디렉터리와 해당 하위 디렉터리에서 파일 이름을 검색합니다(모든 파일에 텍스트를 삽입하려는 경우 *.*일 수 있음). 발견된 파일 중에서 "VirtualHost" 패턴을 검색합니다. 패턴을 찾으면 이를 firstline\nsecondline\notherlines\n\VirtualHost로 바꿉니다. "VirtualHost"는 대체 텍스트의 일부입니다. 그렇지 않으면 해당 텍스트가 손실됩니다.
find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'