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 스크립트에서 쉘 변수를 사용하는 방법더 많은 정보를 알고 싶습니다.