Bash
Perl 去除前面帶有 $ 的子字元串
我知道 perl 認為字元串的一部分
$
是 perl 變數。我試圖用 perl 呼叫做的是重新定義以$
as開頭的變數\$
,但這會引發其他錯誤。我認為我的論點順序錯誤。我的程式碼是:
perl -0pE "use strict; my $repo = "\$repo"; my $arch = "\$arch"; s|\rsync:\/\/[^\]]+|"${linesToWrite}"|"
我收到的編譯器警告是
Can't use global $! in "my" at -e line 1, near "-p destination: $!"
我在 perl 文件中找到了大量詳細說明如何處理它的文件,但沒有太多關於在 bash 中遇到問題的解決方案。
我試過這樣做,但這只是破壞了一切:
perl ""my $repo = "\$repo"; my $arch = "\$arch"" -0pE "use strict; s|\"rsync:\/\/[^\]+|"${linesToWrite}"|"
我將如何正確格式化它以防止 perl 從字元串中刪除 ‘$’ 並使其在使用嚴格打開的情況下進行編譯?
假設您只想要 shell 變數
$repo
$arch
並$linesToWrite
展開,請將它們放在雙引號中,其餘的放在單引號中。彼此相鄰的帶引號的字元串構成一個字元串(“a”‘b’ 是 ab)。(我不知道您對替換命令中的反斜杠做了什麼,所以我留下了它們,但您可能不想要它們)。perl -0pE 'use strict; my $repo = "'"$repo"'"; my $arch = "'"$arch"'"; s|\rsync:\/\/[^\]]+|'"${linesToWrite}"'|'
%ENV
Perl 可以通過散列訪問導出的 shell 變數。使用它可能會簡單得多。就像是:$ export repo arch linesToWrite $ perl -0pE 'use strict; my $repo = $ENV{"repo"}; my $arch = $ENV{"arch"}; s|\rsync:\/\/[^\]]+|$ENV{"linesToWrite"}|'
我不明白你想用那個表達做什麼。您真的要匹配
\r
(換行符,這是來自 Windows 的文件嗎?)還是那樣rsync
?/
如果您|
用作分隔符,為什麼要轉義?此外,沒有太多理由使用use strict
一個襯墊。我可能會將整個事情簡化為:perl -0pE '$repo = $ENV{"repo"}; $arch = $ENV{"arch"}; s|\rsync://[^\]]+|$ENV{"linesToWrite"}|'
或者,更好的是,忘記這些
$repo=$ENV{"repo"}
東西,直接使用$ENV{"repo"}
,$ENV{"arch"}
等等。