주어진 문자열을 포함하는 줄만 sed하는 방법은 무엇입니까?

주어진 문자열을 포함하는 줄만 sed하는 방법은 무엇입니까?

입력하다:

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

즉, "sed" "sdfg"를 "XXXX"로 변환해야 합니다.

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

답변1

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

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

Peter.O가 언급했듯이 위에 작성된 명령은 sdfg포함된 문자열에서 처음 나타나는 항목을 대체합니다 Select ASDF. 정확히 일치하는 항목을 sdfg네 번째 열의 대소문자로만 바꾸려면 다음을 수행해야 합니다.

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

답변2

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

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

답변3

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

고쳐 쓰다: IGNORECASEGNU 이외의 용도에서는 사용하지 마세요 awk. 일치 여부는 대소문자를 구분합니다. 감사해요jw013, 그는 다음과 같이 세부 사항을 지적했습니다.

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

관련 정보