자동으로 색인을 생성하려고 합니다(원본 파일은 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%?})"