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