sed는 블록 뒤에 줄을 추가합니다

sed는 블록 뒤에 줄을 추가합니다

한 디렉토리에 너무 많은 파일(약 100개 파일)이 있습니다 site.ini.append.php.

그것들은 모두 다음과 같습니다:

[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

그러나 [block1]항목 수는 파일에 따라 다릅니다. 다른 블록도 마찬가지다.

끝에 새 줄을 추가해야 합니다 [block2].

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry

[block2]내가 말했듯이 블록에는 서로 다른 항목이 있고 한 파일에는 20줄이 있고 다른 파일에는 10줄이 있을 수 있기 때문에 줄 번호만 사용할 수는 없습니다 .

나는 이런 것을 생각하고 있었다.

sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php

/^\[block2\]$/,/^$/하지만 분명히 주소가 아니기 때문에 작동하지 않습니다 .

어떻게 해야 합니까(가급적이면 sed를 사용)?

고쳐 쓰다

설명대로여기,/^[블록 2]$/,/^$/유효한 주소입니다.

그러나 둘 다,도 아니다나를 위해 문제를 해결해줬어

sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php 

sed -n '/^\[block2\]$/,/^$/ i blabla[]=new_entry' path/to/one_of_the_site.ini.append.php 

환경

$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

답변1

@don_crissti의 제안에 따르면 이는 내 Mac의 GNU sed 및 BSD에서 작동하는 것 같습니다.

sed -e $'/^\\\[block2\\\]$/,/^$/ {/^$/i\\\nnew line\n}' < input

그러나 이는 빈 줄이 있는지에 따라 달라지며, 우리가 찾고 있는 블록이 마지막 블록이라면 파일에 해당 블록이 있는지 확실하지 않습니다.

명령을 시작하고 종료하기 위해 실제 개행 문자를 얻으려면 sed가 필요하므로 iANSI-C 인용문을 사용하여 $''하나를 만들었습니다(ksh/zsh/bash에서 지원됨). 표준 셸에서는 수동으로 삽입해야 합니다.

답변2

 sed  '/block2/,/^$/s/^$/blabla[]=new_entry\n/g' filename

위의 oneliner는 잘 작동합니다. block2와 개행 문자 사이의 줄을 일치시킨 다음 개행 문자를 blabla[]=new_entry\n으로 바꿉니다. 궁금한 점이 있으면 알려주세요.

산출

[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry

[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

관련 정보