2014-08-28 4 views
2

Я пишу скрипт для замены 2 слов из текстового файла. СценарийОшибка при замене слова с помощью perl

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 

Просьба предложить то, что я делаю неправильно.

+1

добавьте -x и -v к вашему вызову bash, и bash сообщит вам, что он работает в каждой строке скрипта bash. Вы увидите, что любая из переменных замещений идет не так. '#!/usr/bin/bash -xv' или bash -xv myscript –

ответ

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, что означает, что вы можете передавать аргументы в однострочный. Переменные Баш были двойные кавычки, чтобы избежать проблем с пробелами в именах файлов и т.д.

В качестве альтернативы, вы можете сделать все это в 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".

+0

Я пробовал первый вариант, но я получаю сообщение об ошибке: basename: invalid option - 's' – ramkrishna

+0

Я предполагаю, что этот параметр не переносится. Вы можете использовать то, что было раньше, а не –

+0

Thaks. Это сработало. – ramkrishna

1

Вы упускаете -e во втором PERL вызова

+0

, когда я помещаю -e, он дает следующую ошибку: Замена замены не завершена на -e строке 1. – ramkrishna

+1

@ramkrishna Это может произойти, если Например, '$ filename' устанавливается на' 'foo \' '. Похоже, вы вызываете 'perl' и' sed' из скрипта 'bash'; у вас будет намного меньше проблем с цитированием, если вы все сделаете в чистом Perl. – ThisSuitIsBlackNot

+1

@ThisSuitIsBlackNot Perl все! –

Смежные вопросы