다른 경기의 첫 경기를 바꾸려고 sed


2

텍스트 파일에서 PATHLOC_NAME특정 그룹 을 변경하고 싶습니다 .

예를 들면 다음과 같습니다.

[a]
PATH=/tmp
SUR=Y
LOC_NAME=USA
[b]
PATH=/tmp
SUR=N
LOC_NAME=UK

따라서 검색을 [b]위해 첫 번째 일치 항목 만 변경하려는 경우 (다음 다음이 아닌 이후 [*]) :

sed -i '/PATH/c\PATH=\/u01'
sed -i '/LOC_NAME/c\LOC_NAME=RUS'

답변:


1

당신은 매우 가까웠습니다!

변경할 부품 의 주소 범위 를 추가 할 수 있습니다 . 당신이에서 블록 외부의 손길이 닿지 않은 모든 것을 남겨 둡니다 [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'

b단어로 바꾸면 을 얻습니다 char 23: extra characters after command. 작동하도록 변경하려면 어떻게해야합니까?
Nir December

단어와 함께 잘 작동합니다 : /^\[yourword\]$/,/^\[/!b. 어쩌면 b식별자의 첫 줄 끝에서 명령을 받았습니까? 그냥 교체 b의를 \[b\]당신의 단어.
Philippos

그래, 나는 둘 다를 의미했다. 이 단어이면 연산자를 사용할 수 없습니다.
Nir December

하지 연산자는 괜찮지 만, 당신이 문자열이있는 경우와 같은 good, sed함께 무엇을 해야할지하지 않습니다 ood다음 g명령을, 그래서 당신은 메시지를 얻을extra characters after command
필리포스

!전체 문자열을 원한다면 어떻게해야 합니까?
Nir

1

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 변수가 되도록 답변을 수정할 수 있습니까 ?
Nir December

1
@Nir, 그렇습니다. awkPerl과 비슷한 것이 있었으면 좋겠지 만 환경은 해결 방법으로 작동합니다 (편집 참조).
ilkkachu '12

둘 다 정확하지만 OS가 지원하지 않기 gawk -i inplace때문에 다른 답변을 선택합니다.
Nir December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.