0

翻訳する必要があります。

\verbatiminput{code.R}

の中へ

\begin{verbatim}
#### Hello world ####
print ("hello world")
#####################
\end{verbatim}

code.Rこれは、パスの代わりにファイルの内容を入れています。

1つの解決策は次のとおりです。

perl -pe 's{\\verbatiminput\{(.*?)\}}{local$/;open F,"<$1";"\\begin{verbatim}".<F>}ge'
  1. を追加する方法は\end{verbatim}?
  2. より良い正規表現はありますか?
4

3 に答える 3

2

sed修飾子をサポートしている場合eは、次のことができます。

$ cat testdata
foo
\verbatiminput{file1}
bar
\verbatiminput{file2}
quux

$ sed -e 's#\\verbatiminput{\([^}]*\)}#echo "\\begin{verbatim}";cat "\1";echo "\\end{verbatim}"#ge' testdata
foo
\begin{verbatim}
this
is
file1

\end{verbatim}
bar
\begin{verbatim}
this
is
file2

\end{verbatim}
quux
于 2013-04-11T11:48:15.213 に答える
0

私はそれをテストしていませんが、このように書き直します(実際には、ワンライナーではなくスクリプトとして行うかもしれません)

  • { の代わりに # の方が明確です
  • "" の代わりに q() は補間が少ないことを意味します
  • の空白local $/
  • もっと () 意図を明確にする
  • 結合が配列コンテキストになるため、ファイル全体が読み取られると確信しています。一方、スカラーコンテキストでは1行を読み取ります

perl -pe 's#\\verbatiminput{(.*?)}#local $/;open(F,"<$1");join(q(),q(\begin{verbatim}"),<F>,q(\end{verbatim})#ge'

于 2013-04-11T10:14:43.987 に答える
0

次の入力を検討してください。

$ cat input
some line 1
some line 2
\verbatiminput{code.R}
some line 3
\verbatiminput{code1.R}

$ cat code.R 
#### Hello world ####
print ("hello world")
#####################

$ cat code1.R 
#### Goodby world ####
print ("goodby world")
#####################

および次の bash スクリプト:

#!/bin/bash

regex='^\verbatiminput\{(.*)\}$'

while read line
do
    if [[ $line =~ $regex ]]
    then 
        file="${BASH_REMATCH[1]}"
        echo \\begin{verbatim}
        cat $file
        echo \\end{verbatim}
    else
        echo $line
    fi
done < input

これにより、次の出力が得られます。

some line 1
some line 2
\begin{verbatim}
#### Hello world ####
print ("hello world")
#####################
\end{verbatim}
some line 3
\begin{verbatim}
#### Goodby world ####
print ("goodby world")
#####################
\end{verbatim}

これは=~、Bash の正規表現一致演算子である which を使用します。一致の結果は、 という配列に保存され$BASH_REMATCHます。最初のキャプチャ グループはインデックス 1 に格納され、2 番目 (存在する場合) はインデックス 2 に格納されます。インデックス 0 は完全一致です。

于 2013-04-11T12:19:17.287 に答える