입력:
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