awk 주입을 피하세요

awk 주입을 피하세요

VCS 로그를 읽고 이를 라텍스로 변환한 다음 템플릿의 키워드를 텍스트로 awk바꾸는 스크립트가 있습니다.@COMMITS@

untagged=$(get-commit-messages "$server" "$rev")
IFS=$'\n' untagged=( $untagged )  # Tokenize based on newlines
for commit in "${untagged[@]}"; do
  tex+="\\\nui{"                  # Wrap each commit in a custom command
  tex+=$(echo "$commit" | pandoc -t latex --wrap=none)
  tex+="}
"
done

awk -v r="$tex" '{gsub(/@COMMITS@/,r)}1' template

커밋 메시지는 실제로는 텍스트일 뿐이므로 pandoc -t latex라텍스 파서가 모든 것을 올바르게 이스케이프하는지 확인하는 데 사용한 것입니다.

내 문제는 awk파서가 이러한 문제를 피할 수 없다는 것입니다. _커밋 메시지에서 a를 찾으면 로 pandoc바뀌지 \_만 다음과 awk같은 경고와 함께 다시 변환됩니다.

awk: warning: escape sequence `\_' treated as plain `_'

이로 인해 Latex 파서가 실패하게 됩니다.

awk피할 수 없는 일을 방지할 수 있는 방법이 있나요 ? 그렇지 않다면 텍스트가 아닌 대체 솔루션을 찾아보겠습니다 awk.

답변1

set 변수를 사용할 때 awk에 이스케이프 시퀀스를 해석하도록 요청하고 있으므로 -v그렇게 하지 마십시오. awk 변수를 리터럴 문자열로 설정 ENVIRON[]하거나 사용하십시오.ARGV[]

$ shellvar='foo\tbar'

$ awk -v awkvar="$shellvar" 'BEGIN{print awkvar}'
foo     bar

$ shellvar="$shellvar" awk 'BEGIN{awkvar=ENVIRON["shellvar"]; print awkvar}'
foo\tbar

$ awk 'BEGIN{awkvar=ARGV[1]; delete ARGV[1]; print awkvar}' "$shellvar"
foo\tbar

바라보다awk 스크립트에서 쉘 변수를 사용하는 방법더 많은 정보를 알고 싶습니다.

관련 정보