백슬래시를 인쇄하려면 awk를 사용하세요.

백슬래시를 인쇄하려면 awk를 사용하세요.

awk를 사용할 때 다음과 같은 백슬래시가 포함된 시퀀스를 인쇄(또는 검색)하는 데 문제가 있습니다.

echo "test\test" | awk '{ gsub(/\\\\t/, "\\\\&"); print }'

결과는 다음과 같습니다.

test    est

\t는 탭 문자로 해석되기 때문입니다. 문자열을 그대로 유지하고 싶습니다. 즉, 다음과 같습니다.

test\test

echo 명령은 bash 스크립트를 사용하여 파일에서 \t와 같은 패턴을 찾을 수 있는지 확인하기 위해 awk 명령의 라인 1을 확인하는 또 다른 방법입니다. 더 구체적으로 - awk cmd를 원한다면 시리즈를 찾아야 합니다.

\"

나는 다음을 사용하고 있습니다 :

awk -v st="$match_string" 'BEGIN {gsub(/\\\\"/,"\\\\&", st)} match($0,st {print;exit}' file.txt

그러나 cmd는 작동하지 않습니다. 다음 내용이 포함된 파일의 경우:

547 %$ 
236 \"
4523 &* 
8876 (*
8756 "/
...

다음과 같이 출력됩니다.

> \"
8756 "/

awk를 사용하여 찾는 올바른 방법은 무엇입니까

236 \"

감사해요

답변1

탭으로 echo확장된다는 것입니다 . 백슬래시가 포함된 문자열을 출력하는 \t데 사용하지 마십시오 echo. 대신 사용하십시오 printf.

printf '%s\n' 'test\test' | awk '{ print }'

또한보십시오:

  • 왜 printf가 echo보다 나은가요?

    거기에서 집으로 가져 가라는 메시지가 있습니다.

    POSIX는 다음과 같이 말합니다. 첫 번째 인수가 -n백슬래시를 포함하는 경우 동작은 지정되지 않습니다.


업데이트된 질문을 고려하십시오.

\"일부 데이터의 두 번째 열을 일치시키고 \"문자열을 프로그램에 인수로 제공하려고 합니다 awk.

string='\\"'
awk -v string="$string" '$2 == string' file

이 반환됩니다

236 \"

질문에 데이터를 제공하십시오. 를 호출할 때 셸에서 변수를 한 번 확장해야 하므로 백슬래시를 이스케이프해야 합니다 awk.

당신은 또한 사용할 수 있습니다

string='\"' awk '$2 == ENVIRON["string"]' file

즉, 문자열을 awk환경 변수로 프로그램에 전달합니다. 이 경우 백슬래시는 다음과 같습니다.아니요탈출해야합니다.

전체 줄에 정규식을 사용하려면 다음을 사용하십시오.

string='\\\\"'
awk -v string="$string" '$0 ~ string' file

또는,

string='\\"' awk '$0 ~ ENVIRON["string"]' file

정규식의 백슬래시 일치는 를 통해 수행되므로 \\이를 에 전달해야 합니다 awk. 사용하는 경우 호출 시 명령줄의 값이 확장되므로 awk -v각 백슬래시를 두 배로 늘려야 합니다 .$stringawk

또한 프로그램에 문자열을 전달할 때 큰따옴표를 사용하여 값을 설정하는 경우 string모든 큰따옴표를 두 배로 늘려야 합니다.awk -vawk다시(셸은 큰따옴표 백슬래시에서 작동하기 때문입니다)그리고문자열에서 큰따옴표를 이스케이프합니다.

string="\\\\\\\\\""
awk -v string="$string" '$0 ~ string' file

따라서 여기의 첫 번째 줄은 셸에서 다음 string으로 설정되고 백슬래시와 큰따옴표를 일치시키는 데 필요한 내용을 기반으로 정규식으로 평가됩니다.\\\\"awk -v string="$string"awk -v string='\\"'

답변2

echo "test\\test"원하는 대로 할 수 있지만 awk를 선호하는 경우 다음과 같이 인쇄할 수 있습니다 .

$ echo "test\test" | awk ' { print }'
test\test

관련 정보