한 디렉토리에 너무 많은 파일(약 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가 필요하므로 i
ANSI-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