여러 파일에 한 줄의 텍스트 추가


10

따라서 디렉토리에 많은 파일이 있으며 각 파일에 한 줄의 텍스트를 삽입해야합니다. 기본적으로 다음과 같은 형식으로되어 있습니다.


<VirtualHost *:80>
        ServerAdmin gabe@localhost
        DocumentRoot /var/www/test1
        ServerName test1.local
        ServerAlias test1
        <Directory "/var/www/test1">
                Options All
                AllowOverride All
        </Directory>
</VirtualHost>

그리고 마감 전에 줄을 삽입하고 싶습니다

</ VirtualHost>
꼬리표. 첫 번째 가정은 sed 로이 작업을 수행 할 수 있어야한다는 것입니다. 아마도 해당 태그를 일치시키고 교체합니다. 나는 지금 이것을 시도하기 시작하지만, 누군가가 이것을 할 기존의 방법이 있다면, 나는 그것을 듣고 싶습니다.


나는 이것이 프로그래밍 작업에 더 가깝다고 생각할 때 정직 할 것입니다 ... 따라서 그렇게해야합니다. 나는 펄을 사용하여 그것을 할 것이다. 특히 아파치 설정을 파싱하고 수정하기 위해 설계된 펄 모듈이 있기 때문이다.
xenoterracide

2
고마워하지만 간단한 유닉스 도구로 쉽게 수행 할 수있는 작업이므로 여기에 물었습니다. 그러나 귀하의 의견에 감사드립니다.
개브.

답변:


10

이 같은:

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

굉장 ... 이것은 내가 찾던 것입니다.
개브.

1
하지 LS를 구문 분석합니다. 대신에 글로브를 사용하십시오. mywiki.wooledge.org/ParsingLs
Chris Down

당신은 rigth @ChrisDown입니다. 제 답변을 향상 시키십시오.
lcipriani

/슬래시를 피할 필요가 없기 때문에 sed 표현 과 다른 문자를 선택하는 것이 더 깨끗합니다.'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
Alexander

2

Perl이 마음에 들지 않으면 다음을 시도하십시오.

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

-i스위치는 함께 이전 파일을 저장합니다 .old현재 하나 확장 및 인쇄 할 수 있습니다.


2

편집이 다소 복잡한 경우 "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"의 이점을 제공합니다. 즉, elaboarte 패턴이있는 위치를 찾고 '커서 움직임'입니다. 패턴을 찾은 다음 다음 인스턴스를 찾은 다음 삽입을 수행하는 등의 작업을 수행 할 수 있습니다. 또는 단순히 삽입하는 대신 텍스트를 변경할 수 있습니다. 또는 범위를 변경할 수 있습니다. "ex"를 사용하면 "."을 사용할 수 있습니다. 현재 줄로., / ^ somepatter / s / blah / foo /가 작동합니다.


0

다음과 같은 한 줄 코드를 사용하여 파일의 특정 위치에 한 줄 또는 여러 줄을 삽입 할 수 있습니다 ( 'VirtualHost'이전). 코드는 기본적으로 주어진 디렉토리와 하위 디렉토리 내에서 파일 이름 (모든 파일에 텍스트를 삽입하려는 경우 *. * 일 수 있음)을 검색합니다. 찾은 파일 내에서 'VirtualHost'패턴을 검색합니다. 패턴을 찾은 후 firstline \ nsecondline \ notherlines \ n \ VirtualHost로 바꿉니다. 'VirtualHost'는 교체 텍스트의 일부이므로 그렇지 않으면 손실됩니다.

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.