기본적으로 제가 하고 싶은 것은 입력이 필터와 일치할 때 출력을 변경하는 것인데, 변경된 부분이 필터링된 부분이 아닙니다(또는 그래서 를 사용합니다 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
사용하십시오.