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

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

기본적으로 내가 원하는 것은 입력이 필터와 일치하지만 변경되는 부분이 필터링되는 부분이 아닌 경우 출력을 변경하는 것입니다(또는 를 사용합니다 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. 값은 hex \x1B또는 octal 입니다 \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사용됩니다.

관련 정보