2

ウィキテキストをラテックスコードに変換するために sed を使用しようとしています。私はほぼ完了しましたが、次のような図のラベルの生成を自動化したいと思います:

[[Image(mypicture.png)]]

... の中へ:

\includegraphics{mypicture.png}\label{img-1}

sedを使い続けたいと思っています。現在使用している正規表現と bash コードは次のとおりです。

__tex_includegraphics="\\\\includegraphics[width=0.95\\\\textwidth]{$__images_dir\/"
__tex_figure_pre="\\\\begin{figure}[H]\\\\centering$__tex_includegraphics"
__tex_figure_post="}\\\\label{img-$__images_counter}\\\\end{figure}"

sed -e "s/\[\[Image(\([^)]*\))\]\].*/$__tex_figure_pre\1$__tex_figure_post/g"\

...しかし、そのカウンターを増加させることはできません。何か案は?

より一般的な観点では、私の質問は次のようになります: sed の一致ごとに異なる置換を作成するために、sed で後方参照を使用できますか? これは、sed がパターンに一致するたびに、\1 を関数の入力として使用し、この関数の結果を置換として使用できますか?

難しい質問であることは承知しており、これには AWK を使用する必要があるかもしれません。ただし、誰かが解決策を持っている場合は、助けていただければ幸いです。

4

2 に答える 2

2

これはうまくいくかもしれません(GNU sed):

sed -r ':a;/'"$PATTERN"'/{x;/./s/.*/echo $((&+1))/e;/./!s/^/1/;x;G;s/'"$PATTERN"'(.*)\n(.*)/'"$PRE"'\2'"$POST"'\1/;ba}' file

これは、シェル変数に含まれる PATTERN を探し、存在しない場合は現在の行を出力します。パターンが存在する場合は、ホールド スペース内のカウンターをインクリメントまたは準備し、そのカウンターを現在の行に追加します。パターンは、シェル変数 PRE と POST およびカウンターを使用して置き換えられます。最後に、現在の行がパターンのさらなるケースについてチェックされ、必要に応じて手順が繰り返されます。

于 2013-10-06T07:57:33.160 に答える
2

シェル機能を使用してファイルを行ごとに読み取り、行ごとに個別の sed コマンドを使用できます。何かのようなもの

exec 0<input_file

while read line; do
    echo $line | sed -e "s/\[\[Image(\([^)]*\))\]\].*/$__tex_figure_pre\1$__tex_figure_post/g"
    __images_counter=$(expr $__images_counter + 1)
done

(ただし、1 行に複数の一致がある場合、これは機能しません。)

sed2 番目の部分については、一致するものを実行またはgrep検索しsed、一致したテキストの関数の値をコマンドに代入して再度実行することをお勧めします。

于 2013-10-05T23:02:49.043 に答える