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 }'
또한보십시오:
-
거기에서 집으로 가져 가라는 메시지가 있습니다.
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
각 백슬래시를 두 배로 늘려야 합니다 .$string
awk
또한 프로그램에 문자열을 전달할 때 큰따옴표를 사용하여 값을 설정하는 경우 string
모든 큰따옴표를 두 배로 늘려야 합니다.awk -v
awk
다시(셸은 큰따옴표 백슬래시에서 작동하기 때문입니다)그리고문자열에서 큰따옴표를 이스케이프합니다.
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