
次のようなエントリでいっぱいのファイルがあります。
`\index{a!b!c} \index{small!medium!large} \index{mouse!dog!elephant}`
これらすべてを変更するには、次のスクリプトが必要です。
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}
基本的に何が起こるのかは、LaTexファイルのインデックスエントリを作成し、インデックスエントリの順序を逆にすることです。この問題を解決できるスクリプトが必要です。誰でもどんなアイデアがありますか?
答え1
次の方法でこれを実行できますPerl
。
perl -lpe 's|\\index\{\K.*?(?=\})|join "!", reverse split "!", $&|eg'
簡単な説明:
- その位置の左側
\index{
と}
右側に最も近い部分をキャプチャブラケットとして選択します。 - バンに分けて、割れた部分を再配置し、バンに再接続してみてください。
- これらの組み合わせを見つけるには、その行でこれを複数回繰り返します。
答え2
awk
次のことを試すことができます。
echo '\index{a!b!c} \index{small!medium!large} \index{mouse!dog!elephant}' | awk '{ print gensub(/\{([^!]*)!([^!]*)!([^!]*)\}/,"{\\3!\\2!\\1}", "g") }'
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}
またはperl
perl -n -p -e ' s#(\\index\{)([^!]+)\!([^!]+)\!([^!]+)\}#$1$4\!$3\!$2\}#g'
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}
答え3
sed -E 's/\{([^!]*)!([^!]*)!([^}]*)}/{\3!\2!\1\}/g'
例:
$ var='\index{a!b!c} \index{small!medium!large} \index{mouse!dog!elephant}'
$ echo "$var" | sed -E 's/\{([^!]*)!([^!]*)!([^}]*)}/{\3!\2!\1\}/g'
\index{c!b!a} \index{large!medium!small} \index{elephant!dog!mouse}