sed: 동일하지만 동일하지 않은 다음 줄 앞에 무언가를 삽입합니다.

sed: 동일하지만 동일하지 않은 다음 줄 앞에 무언가를 삽입합니다.

한 줄에 하나의 용어집 항목이 있는 LaTeX 파일이 있습니다.

...
\newglossaryentry{ajahn}{name=Ajahn,description={\textit{(Thai)} From the Pali \textit{achariya}, a Buddhist monk's preceptor: `teacher'; often used as a title of the senior monk or monks at monastery. In the West, the forest tradition uses it for all monks and nuns of more than ten years' seniority}}
\newglossaryentry{ajivaka}{name={\=Aj\={\i}vaka},description={Sect of contemplatives contemporary with the Buddha who held the view that beings have no volitional control over their actions and that the universe runs according to fate and destiny}}
...

\newglossaryentry{label}여기서는 각 행의 부분 에만 관심이 있습니다 .

sort중복 태그가 다음과 같이 보이도록 파일의 행이 정렬되었습니다 .

\newglossaryentry{anapanasati}{name=\=an\=ap\=anasati,description={`Awareness of inhalation and exhalation'; using the breath, as a mediation object},sort=anapanasati}
\newglossaryentry{anapanasati}{name={\=an\=ap\=anasati},description={Mindfulness of breathing. A meditation practice in which one maintains one's attention and mindfulness on the sensations of breathing. \textbf{[MORE]}}}

sed이 파일에서 반복 태그 앞에 줄을 삽입하려면 어떻게 해야 합니까 ?

#!/bin/sh

cat glossary.tex | sed '
/\\newglossaryentry[{][^}]*[}]/{
    N;
    s/^\(\\newglossaryentry[{][^}]*[}]\)\(.*\)\n\1/% duplicate\n\1\2\n\1/;
}' > glossary.sed.tex

위의 명령을 따랐지만 결함이 있습니다. 패턴 공간의 행을 쌍으로 읽으므로 중복된 항목이 읽은 쌍인 경우에만 작동합니다.

예를 들어 다음은 일치하지 않습니다.

\newglossaryentry{abhinna}{name={abhi\~n\~n\=a},description={Intuitive powers that come from the practice of concentration: the ability to display psychic powers, clairvoyance, clairaudience, the ability to know the thoughts of others, recollection of past lifetimes, and the knowledge that does away with mental effluents (see \textit{asava}).}}
\newglossaryentry{acariya}{name={\=acariya},description={Teacher; mentor. See \textit{kalyanamitta.}}}
\newglossaryentry{acariya}{name=\=acariya,description={Teacher},see=Ajahn}
\newglossaryentry{adhitthana}{name={adhi\d{t}\d{t}h\=ana},description={Determination; resolution. One of the ten perfections \textit{(paramis).}}}

먼저 다음 줄을 읽으므로아비나그리고아차리아, 그러면 다음과 같이 읽혀집니다아차리아그리고아디 타나.

공간을 유지하고 조건부로 선을 인쇄하려면 추가 마법이 필요하다고 생각 sed하지만 알아낼 수는 없습니다.

답변1

이는 sed의 경우 상당히 복잡하며 awk 또는 Perl의 작업과 비슷합니다. 다음은 연속적인 중복 항목을 찾는 스크립트입니다(그러나 그 사이에 일치하지 않는 줄은 허용).

perl -l -pe '
    if (/^ *\\newglossaryentry[* ]*{([^{}]*)}/) {
        print "% duplicate" if $1 eq $prev;
        $prev = $1;
    }'

정렬되지 않은 입력에서도 중복 항목이 쉽게 감지됩니다.

perl -l -pe '
    if (/^ *\\newglossaryentry[* ]*{([^{}]*)}/) {
        print "% duplicate" if $seen{$1};
        ++$seen{$1};
    }'

연속된 행으로 쉽게 제한할 수도 있습니다.

perl -l -pe '
    if (/^ *\\newglossaryentry[* ]*{([^{}]*)}/) {
        print "% duplicate" if $1 eq $prev;
        $prev = $1;
    } else {undef $prev}'

관련 정보