Perl 정규 표현식의 열거에 항목 대체를 적용하시겠습니까?

Perl 정규 표현식의 열거에 항목 대체를 적용하시겠습니까?

데이터

7. Masi is the same as
\begin{enumerate}
A
B
ABC ha lorem
\end{enumerate}

1. ABC is
\begin{enumerate}
P
B
Lorem maam
\end{enumerate}

나는 ~가되고 싶다

7. Masi is the same as
\begin{enumerate}
\item A
\item B
\item ABC ha lorem
\end{enumerate}

1. ABC is
\begin{enumerate}
\item P
\item B
\item Lorem maam
\end{enumerate}

내 시작 정규식은 다음을 기반으로 합니다.답변

perl -000pe
s/\n/\n\\begin{enumerate}\n [A-Za-z1-9]* \end{enumerate}/
... [problem here!]
masi.tex

어디

  • -000 : 각 질문이 한 줄로 처리되도록 "줄"을 두 개의 연속 줄 바꿈(\n\n)으로 정의하는 Perl의 단락 모드를 활성화합니다.
  • -pe : 입력 파일의 각 라인을 읽어 -e(-p)로 전달된 스크립트를 적용한 후 인쇄합니다.

\item일치하는 각 줄의 시작 부분을 .My 의사 코드 로 바꾸고 싶습니다 .문제는 여기 코드에 있습니다

s/\n/\project/g

열거형 컨텍스트에서 항목을 적용합니다.

어떻게

답변1

당신은 사용할 수 있습니다 ..또는범위운영자는 교체를 시작/끝 부분으로 제한합니다.

while (<DATA>) {
   if ( /\\begin/ .. /\\end/ ) {
       s/^(?!\\)/\\item /;  
   }
   print;
}

__DATA__
7. Masi is the same as
\begin{enumerate}
A
B
ABC ha lorem
\end{enumerate}

1. ABC is
\begin{enumerate}
P
B
Lorem maam
\end{enumerat

명령줄 스크립트를 선호하는 경우:

perl -ne 'if (/\\begin/../\\end/) {s/^(?!\\)/\\item /};print'

또는 암시적으로 더 짧은 것을 사용하십시오 print.

perl -pe 'if (/\\begin/../\\end/) {s/^(?!\\)/\\item /}'

이것은 (?!...)부정적인 전달 주장입니다.

답변2

또 다른 Perl해결책:

$ perl -pe '
    if (/\\begin/../\\end/) {
        next if /\\begin/ || /\\end/;
        s/^/\\item /;
    }
' file
7. Masi is the same as
\begin{enumerate}
\item A
\item B
\item ABC ha lorem
\end{enumerate}

1. ABC is
\begin{enumerate}
\item P
\item B
\item Lorem maam
\end{enumerate}

설명하다

  • if (/\\begin/../\\end/): 줄 구분 기호는 로 시작 \begin하고 끝납니다 \end.
  • next if /\\begin/ || /\\end/: 시작과 끝은 필요 없으니 생략하세요.
  • s/^/\\item /: 각 줄의 시작 부분을 원하는 패턴으로 바꿉니다.
  • -pperl옵션을 사용하면 각 줄을 처리한 후 인쇄됩니다 .

답변3

플래그를 사용하세요. enumerate를 입력할 때 1로 설정되고 끝에서 0으로 지워집니다. 플래그 설정 시 항목 삽입:

perl -pe '$inside = 0 if /\\end{enumerate}/;
          print "\\item " if $inside;
          $inside = 1 if /\\begin{enumerate}/;
         ' input.tex

인쇄하기 전에 끝을 확인하므로 \item끝 줄 앞에는 추가되지 않습니다.

관련 정보