주어진 문자열을 포함하는 줄만 sed하는 방법?


13

입력:

Select ASDF 325 sdfg sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg sdfg 4456 sdrg

산출:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

간단히 말해서 "sdfg"를 "XXXX"로 "sed"해야합니다.

그러나 "ASDF 선택"문자열이 포함 된 줄에만 해당됩니다. 어떻게해야합니까? (sed, awk 등 : \)

답변:


19

대부분의 sed 명령 앞에 주소 를 붙여 적용 할 행을 제한 할 수 있습니다. 주소는 줄 번호이거나로 구분되는 정규식 일 수 있습니다 /.

cat INPUT | sed '/Select ASDF/ s=sdfg=XXXX='

Peter.O에서 언급했듯이 위에서 작성된 명령은을 sdfg포함하는 문자열에서 처음 나타나는 것을 대체합니다 Select ASDF. sdfg네 번째 열에있는 경우에만 정확한 일치를 대체 해야하는 경우 다음과 같이하십시오.

cat INPUT | sed 's/\(^Select ASDF [^ ]* \)sdfg /\1XXXX /'

1
sdfg를 포함하는 다른 필드는 어떻 습니까? 예. 5sdfga
Peter.O

흠, 사실 그것은 문제가 아닙니다. 내 답변을 업데이트했습니다.
rush

sed '/ Select ASDF / gs = sdfg = XXXX ='-첫 번째 항목뿐만 아니라 한 줄의 모든 항목을 바꿔야합니다. 내가 "g"를 사용하는 경우 만 나오지 오류를 제공
LanceBaynes

1
g마지막 후에 =( s명령 끝에서) 입력해야합니다 . : 그것은이 같은 것sed '/Select ASDF/ s=sdfg=XXXX=g'
러시

7

값이 정확한 경우 열 4 만 변경하는 경우 정규식 대신 등호 연산자를 사용하는 것이 좋습니다.

awk '$1 == "Select" && $2 == "ASDF" && $4 == "sdfg" {$4 = "XXXX"} {print}'

1
빠른! .. Birei 의 awk와 Rush의 위치 sed를 사용 하여 백만 라인에 대해 비교 : 0m1.580s vs. 0m3.792s vs. 0m6.740s
Peter.O

1

사용 GNU awk:

awk '
    BEGIN { IGNORECASE = 1 } 
    /^select asdf/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

산출:

Select ASDF 325 XXXX sdflk lk
Select TRG 46sdg rasdftz fsgs 45
Select ASDF 6ffg XXXX 4456 sdrg

업데이트 : IGNORECASE비 GNU는 피하고 awk대소 문자를 구분합니다. 그 세부 사항을 지적한 jw013 덕분에 :

awk ' 
    /^Select ASDF/ { 
        sub( /\<sdfg\>/, "XXXX", $0 ) 
    } 
    { print }
' infile

1
IGNORECASEGNU awk/ gawk확장자를 언급해야 합니다.
jw013

1
@ jw013 : 감사합니다. 귀하의 제안으로 답변을 업데이트했습니다.
Birei

4
이 경우 GNU 또는 G'not에 관계없이 IGNORECASE는 잘못되었습니다. 문제의 기준은 명시 적으로 대문자ASDF
Peter입니다 .O
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.