基于如何防止 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
或类似的方法来避免两次或多次修改相同的文件名。