2016-12-31 49 views
0

我在某个位置有几十个bash脚本(/subdirectory1),文件中的路径名不正确(pathname1)。我想以某种方式替换该路径名为pathname2,该子目录中的所有bash脚本*.sh如何在多个文件上执行字符串替换?

有没有一个标准的方法来做到这一点?

在Perl中,如果我用一个单一的文件file1的工作,我会执行:

perl -pi -e 's/pathname1/pathname2/g' file1 

一个将如何做到这一点的所有文件,*.sh

它不一定在perl中,但这是想到的一种方法。我怀疑还有一种方法可以用其他shell脚本和其他语言来做到这一点---我会很乐意编辑这个问题来缩小选项的范围。

+1

将'file1'更改为'* .sh'?你的问题真的不清楚。 –

+1

当然'perl -pi -e's/path1/path2/g'* .sh'将会诀窍 –

+0

@WilliamPursell工作正常吗? ...我是个白痴 – ShanZhengYang

回答

2

您可以先运行find列出的文件,然后在它们上面运行perlsed或什么:

find . -name '*.sh' -exec <perl_command> {} \; 

注意{} \;,这意味着运行此为每个find输出。

+0

你应该用''来表示你的意思(我假设'-name“* .sh”',但我认为''是非常明显的)。 –

+0

我认为这是一种正交的问题,但肯定。固定。 – yelsayed

+0

我正在考虑另一个注释,比如''file_pattern>''可能是'-name“* .sh”'或'-type'f'或某种组合来表示它的一般用法。但是,它也是内联的。 –

3

只是列出所有的文件名,并且它们通过在那里|用于分隔符所以/路径不需要进行转义线

perl -pi -e 's|pathname1|pathname2|g' *.sh 

所有加工线。

这假定*.sh指定您需要的文件。


我们可以看到,这是通过运行

perl -MO=Deparse -ne '' file1 file2 

其输出

LINE: while (defined($_ = <ARGV>)) { 
    '???'; 
} 
-e syntax OK 

这相当于代码的一行程序,通过-MO=Deparse礼貌所示的情况下。它告诉我们,环路设置了输入,这是由<ARGV>提供。

那么,什么是<ARGV>这里?从I/O Operators in perlop

的空文件句柄<>是特殊的:...从<>输入是无论是从标准输入,或在命令行上列出的每个文件。

其中

<>只是为<ARGV>

所以输入将是从所有提交的文件中的所有行的代名词。

相关问题