주어진 문자열을 포함하는 줄만 sed하는 방법? sdrg 산출: Select ASDF 325 XXXX sdflk lk Select

입력:

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 등 : \)



답변

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

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

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

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


답변

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

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


답변

사용 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


답변