自動的にインデックスを作成しようとしています(元のファイルはLyXを使用して作成されますが、ここでは重要ではありません。Lyxツールを使用したくありません)。
索引付けしたい単語ごとに、その単語が表示されるたびに次のコードを挿入する必要があります(ここでは「foo」が例として使用されています)。
\begin_inset Index idx
status open
\begin_layout Plain Layout
Foo
\end_layout
\end_inset
だから現在私はsedを使用しています。
sed -i 's/foo/foo\n\\begin_inset Index idx\nstatus open\n\n\\begin_layout Plain Layout\nFoo\n\\end_layout\n\n\\end_inset\n\n/g' myfile.lyx
うまくいきますが、多数の単語をインデックス化する必要があるため、インデックス化したいすべての単語のリストを含むファイルを使用して同じことをしたいと思います。
たとえば、以下を含む file1 があります。
blablabla foo blablabla bar
blaba bar blabla word
以下を含むリストファイル(file2)
foo
bar
word
私のfile1が次のようになりたいです。
blablabla foo
\begin_inset Index idx
status open
\begin_layout Plain Layout
Foo
\end_layout
\end_inset
blablabla bar
\begin_inset Index idx
status open
\begin_layout Plain Layout
Bar
\end_layout
\end_inset
blaba bar
\begin_inset Index idx
status open
\begin_layout Plain Layout
Bar
\end_layout
\end_inset
blabla word
\begin_inset Index idx
status open
\begin_layout Plain Layout
Word
\end_layout
\end_inset
この問題を解決するための最良の方法は何ですか?
ベストアンサー1
sedが-r
(または-E
)をサポートしている場合は、パターン置換を使用できます。
sed -r 's/(foo|bar|word)/\1\n\\begin_inset Index idx\nstatus open\n\n\\begin_layout Plain Layout\n\1\n\\end_layout\n\n\\end_inset\n\n/g'
デフォルトでは、最初の部分から単語を取得し、(word1|word2|word3|...)
代替\1
部分でそれを参照して、正確に一致する単語を再配置できます。
その後、ファイルから最初のスキーマを構築するのは非常に簡単です。例えば、
list=$(tr '\012' '|' < listfile)
list="(${list%?})"