如何防止破坏符号链接,何时使用 Perl 替换为 sed 正则表达式?

如何防止破坏符号链接,何时使用 Perl 替换为 sed 正则表达式?

基于如何防止 sed -i 破坏符号链接?,但我使用 Perl。

我在所有这些问题中尝试过:

但没有成功。这是一个小而简单的示例:

#!/bin/perl
use strict; use warnings;

while (<>) 
{

  ## For all lines, replace all occurrences of #5c616c with another colour
  s/#5c616c/#8bbac9/g $(readlink -e -- "<>")

  ## $(readlink -e -- "<>") is similar to --in-place --follow-symlinks

  ## Print the line
  print;
}

答案1

readlink -e命令不可移植,因此不应依赖该命令。

$ cat input
Like quills upon the fretful porpentine.
$ ln -s input alink
$ readlink -e alink
readlink: illegal option -- e
usage: readlink [-n] [file ...]

在 Perl 代码中,将链接替换为它指向的文件名Perl的readlink函数然后像往常一样循环输入。

$ perl -i -ple 'BEGIN{for(@ARGV){ $_=readlink if -l }} tr/A-Z/a-z/' alink

alink仍然是符号链接,内容input已修改:

$ perl -E 'say readlink "alink"'
input
$ cat input
LIKE QUILLS UPON THE FRETFUL PORPENTINE.

在 Perl 脚本中,这可能看起来像

#!/usr/bin/env perl
use strict;
use warnings;

for my $arg (@ARGV) {
    $arg = readlink $arg if -l $arg;
}

# in-place edit with backup filename, perldoc -v '$^I'
$^I = ".whoops";

while (readline) {
    s/#5c616c/#8bbac9/g;
    print;
}

如果输入包含重复的文件名,则可能需要List::Util::uniq或类似的方法来避免两次或多次修改相同的文件名。

相关内容