リストファイルに置き換える

リストファイルに置き換える

自動的にインデックスを作成しようとしています(元のファイルは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%?})"

おすすめ記事