일치 항목과 일치하지 않는 항목을 인쇄하려면 어떻게 해야 합니까?

일치 항목과 일치하지 않는 항목을 인쇄하려면 어떻게 해야 합니까?

기본적으로 제가 하고 싶은 것은 입력이 필터와 일치할 때 출력을 변경하는 것인데, 변경된 부분이 필터링된 부분이 아닙니다(또는 그래서 를 사용합니다 sed). 지금까지의 문제는 awk변경된 행만 출력한다는 것입니다.

간단한 예를 들어 test.txt에 다음을 입력하세요.

orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk

코드를 사용하는 경우:

awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt

나는 얻다:

orange beet pear cow~milk
orange melon cherry cow~milk

내가 원하는 경우:

orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk

awk로 할 수 있다는 걸 알지만 ||, 위의 gsub와 일치하게 만드는 방법을 찾지 못했습니다.

보너스 부가 가치를 위해 제가 정말로 하고 싶은 것은 대신 색상을 추가하는 것입니다 ~. 그러나 이는 완전히 중단됩니다.

awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt

\줄의 끝이 아니라는 오류가 발생합니다 .

답변1

색상의 경우 실제 ESC 문자(이스케이프된 형식 아님 \e)를 지정해야 합니다. 값은 16진수 \x1B또는 8진수 입니다 \033. 다음 스크립트는 -모든 입력 줄을 대시로 표시하고 인쇄합니다.

awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"

sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"

답변2

몇 줄만 수정한 후 각 줄을 인쇄하려면 ( 1)와 같이 항상 true로 평가되는 별도의 조건을 추가하세요.

awk '/orange/{gsub("cow", "cow~")} 1' "$file"

다음을 지정할 수도 있습니다 {print}.

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"

모든 awk 문에는 조건과 문 절이 포함되어 있다는 점을 기억하세요.

condition {statements}

그러나 이들 각각을 포함하지 않으면 선택 사항입니다.{statements}, 그런 다음 {print}사용하십시오. 포함하지 않으면condition, 그런 다음 1사용하십시오.

관련 정보