Substituição com um arquivo de lista

1

Estou tentando automatizar a criação de um índice (o arquivo original foi criado com o LyX, mas não importa aqui, não quero usar a ferramenta Lyx).

Para cada palavra que eu quero indexar eu preciso inserir, logo após cada ocorrência da palavra, o seguinte código (com "foo" como exemplo aqui):

\begin_inset Index idx
status open

\begin_layout Plain Layout
Foo
\end_layout

\end_inset

Então, no momento, uso o 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

Funciona, mas como eu preciso indexar toneladas de palavras, eu gostaria de fazer o mesmo usando um arquivo contendo uma lista de todas as palavras que eu quero indexar.

Por exemplo, eu tenho um arquivo1 contendo:

blablabla foo blablabla bar
blaba bar blabla word

E um arquivo de lista (arquivo2) contendo:

foo
bar
word

E eu quero o meu arquivo1 assim:

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

Qual é a melhor maneira de abordar isso?

    
por Texxet 13.09.2016 / 18:32

1 resposta

2

Se o seu sed for compatível com -r (ou -E ), você poderá usar a alternância de padrões:

sed -r 's/(foo|bar|word)/\n\begin_inset Index idx\nstatus open\n\n\begin_layout Plain Layout\n\n\end_layout\n\n\end_inset\n\n/g'

Basicamente, coloque as palavras na primeira seção como (word1|word2|word3|...) e, em seguida, você pode referenciá-las como na seção de substituição para retornar exatamente a palavra que foi correspondida.

É simples o suficiente para construir o primeiro padrão a partir do arquivo. Por exemplo,

list=$(tr '2' '|' < listfile)
list="(${list%?})"
    
por 13.09.2016 / 18:44

Tags