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