使用perl替换单词时出错

时间:2014-08-28 16:28:20

标签: perl

我正在编写一个脚本,用于替换文本文件中的2个单词。脚本是

count=1
for f in *.pdf
do
    filename="$(basename $f)"
    filename="${filename%.*}"
    filename="${filename//_/ }"
    echo $filename
    echo $f

    perl -pe 's/intime_mean_pu.pdf/'$f'/' fig.tex > fig_$count.tex
    perl -pi 's/TitleFrame/'$filename'/' fig_$count.tex

    sed -i '/Pointer-rk/r fig_'$count'.tex' $1.tex
    count=$((count+1))
done

但是使用第二个perl命令替换单词会出错:

Can't open perl script "s/TitleFrame/Masses1/": No such file or directory

请建议我做错了什么。

2 个答案:

答案 0 :(得分:2)

您可以将脚本更改为以下内容:

#!/bin/bash

for f in *.pdf; do
    filename=$(basename "$f" .pdf)
    filename=${filename//_/}

    perl -spe 's/intime_mean_pu.pdf/$a/;
    s/TitleFrame/$b/' < fig.tex -- -a="$f" -b="$filename" > "fig_$count.tex"

    sed -i "/Pointer-rk/r fig_$count.tex" "$1.tex"
    ((++count))
done

除了对脚本进行一些其他细微更改之外,我还使用了-s切换到Perl,这意味着您可以将参数传递给单行。 bash变量已被双引号以避免文件名中的空格等问题。

或者,您可以在Perl中完成所有工作:

#!/usr/bin/env perl

use strict;
use warnings;
use autodie;

use File::Basename;

my $file_arg = shift;
my $count = 1;

for my $f (glob "*.pdf") {
    my $name = fileparse($f, qq(.pdf));

    open my $in, "<", $file_arg;
    open my $out, ">", 'tmp';
    open my $fig, "<", 'fig.tex';    

    # copy up to match
    while (<$in>) {
        print $out $_;
        last if /Pointer-rk/;
    }

    # insert contents of figure (with substitutions)
    while (<$fig>) {
        s/intime_mean_pu.pdf/$f/;
        s/TitleFrame/$name/;
        print $out $_;
    }

    # copy rest of file
    print $out $_ while <$in>;

    rename 'tmp', $file_arg;
    ++$count;
}

使用perl script.pl "$1.tex"等脚本。

答案 1 :(得分:1)

你在第二次perl调用中错过了-e