用正则表达式替换文件路径的内容

时间:2013-04-11 09:09:17

标签: regex bash

我需要翻译;

\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. 任何更好的正则表达式?

3 个答案:

答案 0 :(得分:0)

我还没有测试过,但我会像这样重写(实际上我可能会以脚本而不是单行编写)

  • #而不是{更清楚
  • q()而不是“”表示更少插值
  • local $/
  • 中的空格
  • more()使意图更清晰
  • 我很确定在连接中将在数组上下文中,因此将读取整个文件。而在标量上下文中将读取一行

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

答案 1 :(得分:0)

如果您的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

答案 2 :(得分: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的正则表达式匹配运算符。匹配结果将保存到名为$BASH_REMATCH的数组中。第一个捕获组存储在索引1中,第二个(如果有)存储在索引2中,等等。索引零是完全匹配。