用列表文件替换

用列表文件替换

我正在尝试自动创建索引(原始文件已使用 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%?})"

相关内容