Sed

如何防止破壞符號連結,使用 Perl 何時用 sed 正則表達式替換?

  • January 6, 2019

基於如何防止 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;
}

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或類似的方法來避免兩次或多次修改相同的文件名。

引用自:https://unix.stackexchange.com/questions/492886