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:各質問が1行として処理されるように、「行」を2つの連続する改行(\ 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終了行の前には追加されません。

関連情報