如何在多个文件上执行字符串替换?

时间:2016-12-31 03:33:01

标签: bash perl shell replace substitution

我在某个位置(/subdirectory1)有几十个bash脚本,文件中的路径名(pathname1)不正确。对于该子目录中的所有bash脚本pathname2,我想以某种方式用*.sh替换此路径名。

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

在perl中,如果我使用单个文件file1,我会执行:

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

如何为所有文件*.sh完成此操作?

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

3 个答案:

答案 0 :(得分:2)

您可以先运行find列出文件,然后运行perlsed或其他任何内容:

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

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

答案 1 :(得分:2)

只列出所有文件名,它们都是逐行处理的

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>

的同义词

因此输入将是所有提交文件的所有行。

答案 2 :(得分:1)

只需使用文件glob:

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

这将处理包含空格的病理文件名。

相关问题