0

我需要翻译;

\verbatiminput{code.R}

进入

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

那就是放置文件的内容code.R而不是路径。

一种解决方案是;

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 $/
  • more() 使意图更清晰
  • 我很确定在连接中将在数组上下文中,因此将读取整个文件。而在标量上下文中将读取一行

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}

这使用=~which 是 Bash 的正则表达式匹配运算符。匹配结果保存到一个名为 的数组中$BASH_REMATCH。第一个捕获组存储在索引 1 中,第二个(如果有)存储在索引 2 中,依此类推。索引 0 是完全匹配。

于 2013-04-11T12:19:17.287 回答