답변:
당신은 매우 가까웠습니다!
변경할 부품 의 주소 범위 를 추가 할 수 있습니다 . 당신이에서 블록 외부의 손길이 닿지 않은 모든 것을 남겨 둡니다 [b]
로 시작하는 다음 행으로 줄 [
, 두 표현식 (지금 당신은 단지 블록이 변경 될 수있어) 콤마 (,)로 구분하여 주소 범위를 선택로 반전 !
당신이있어 지금 ( 다른 모든 항목)을 사용하고 명령 b
을 사용 하여 스크립트 끝으로 분기하십시오. 따라서 다음의 모든 명령은 범위 내의 행에만 영향을 미칩니다.
sed -i '/^\[b\]$/,/^\[/!b
/PATH/c\PATH=\/u01
/LOC_NAME/c\LOC_NAME=RUS'
물론 반전 및 분기 대신 반전 {commands;...;}
되지 않은 일치에 블록을 사용할 수는 있지만 읽기는 쉽지 않습니다.
변수 안의 단어를 식별자로 사용하려면 다음과 같이하십시오.
ID=foo
sed -i '/^\['$ID'\]$/,/^\[/!b
/PATH/c\PATH=\/u01
/LOC_NAME/c\LOC_NAME=RUS'
/^\[yourword\]$/,/^\[/!b
. 어쩌면 b
식별자의 첫 줄 끝에서 명령을 받았습니까? 그냥 교체 b
의를 \[b\]
당신의 단어.
good
, sed
함께 무엇을 해야할지하지 않습니다 ood
다음 g
명령을, 그래서 당신은 메시지를 얻을extra characters after command
!
전체 문자열을 원한다면 어떻게해야 합니까?
awk
또는 Perl을 사용 하면 더 쉽습니다 .
$ cat input
[a]
PATH=/tmp
[b]
PATH=/tmp
OTHERPATH=/somedir
[c]
PATH=/tmp
$ gr="[b]"
$ repl=/u01
$ awk -vgr="$gr" -vrepl="$repl" '/^\[.*\]$/ { group=$0 } group == gr && /^PATH=/ { $0 = "PATH=" repl } 1' input
[a]
PATH=/tmp
[b]
PATH=/u01
OTHERPATH=/somedir
[c]
PATH=/tmp
$ gr=b
$ repl=/u01
$ gr=$gr repl=$repl perl -pe '$group = $1 if /^\[(.*)\]$/; s,^PATH=.*,PATH=$ENV{repl}, if $group eq $ENV{gr}' < input
[same output]
아이디어는가있는 행을 찾아서 [something]
이름을 적어두고 그에 따라 조건부로 바꾸는 것입니다. (awk 버전은 대괄호를 사용하여 그룹 이름을 사용하고, Perl 버전은 사용하지 않습니다. 후자는 더 예쁘지 만 Perl에서와 같이 awk에서는 사소한 것이 아닙니다. Perl 버전은 환경을 통해 변수를 가져옵니다. 로 export
gr
하고 repl
, 또는 동일한 명령 줄에 지정합니다.)
키가 정확히 경우에만 교체하도록 수정 PATH
했지만 여전히 첫 번째가 아닌 PATH
동일한 [b]
제목 아래의 모든을 변경 하지만 여러 개를 가질 수 있는지 확실하지 않습니다.
b
과 /u01
값이 bash 변수가 되도록 답변을 수정할 수 있습니까 ?
awk
Perl과 비슷한 것이 있었으면 좋겠지 만 환경은 해결 방법으로 작동합니다 (편집 참조).
gawk -i inplace
때문에 다른 답변을 선택합니다.
b
단어로 바꾸면 을 얻습니다char 23: extra characters after command
. 작동하도록 변경하려면 어떻게해야합니까?