[英]Why doesn't my Perl one-liner work on Windows?
從 Windows 命令提示符生成一個目錄中所有文件的文本文件:
dir c:\logfiles /B > config.txt
Output:
0001_832ec657.log
0002_a7c8eafc.log
我需要將“config.txt”文件提供給另一個可執行文件,但在此之前,我需要修改文件以添加可執行文件所需的一些附加信息。 所以我使用以下命令:
perl -p -i.bak -e 's/log/log,XYZ/g' config.txt
我期望結果是:
0001_832ec657.log,XYZ
0002_a7c8eafc.log,XYZ
但是,“config.txt”文件沒有被修改。 使用“-w”選項,我收到警告消息:
在 -e 第 1 行的 void 上下文中無用地使用常量。
我究竟做錯了什么?
Windows cmd.exe
不使用'
作為字符串分隔符,僅使用"
。您所做的相當於:
perl -p -i.bak -e "'s/log/log,XYZ/g'" config.txt
所以-w
抱怨“你給了我一個字符串,但它什么也沒做”。
解決方案是改用雙引號:
perl -p -i.bak -e "s/log/log,XYZ/g" config.txt
或者干脆將它們關閉,因為此命令中沒有將由cmd.exe
解釋的元字符。
cmd.exe
對於任何習慣使用類似sh
的 shell 的人來說都是一個非常麻煩的野獸。 以下是有關perl
調用的其他一些常見故障和解決方法。
@REM doesn't work: perl -e"print" @REM works: perl -e "print" @REM doesn't work: perl -e "print \"Hello, world!\n\"" @REM works: perl -e "print qq(Hello, world!\n)"
ephemient的回答很好地總結了問題,但您確實有另一個選擇:將 shell 從cmd.exe
更改為更好的 shell。 如果您是 Unix 類型的人,那么我建議您研究提供您習慣的那種環境的Cygwin (例如, Bash和 GNU 實用程序)。
如果您是 Windows 類型的人,我建議您查看PowerShell (née MSH née Monad)。 實際上,即使您是 Unix 類型的人,我也建議您研究 PowerShell。 它與.NET集成,並具有許多簡潔的功能(例如對象通過管道而不是簡單的文本行)。 如果我被困在 Microsoft 操作系統上,我會使用 shell。
人們似乎喜歡的 Windows 的其他外殼:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.