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スクリプトでシェル変数を使用する方法より多くの情報を知りたいです。