From the Windows command prompt I generate a text file of all the files in a directory:
dir c:\logfiles /B > config.txtOutput:
0001_832ec657.log0002_a7c8eafc.logI need to feed the "config.txt" file to another executable, but before I do so, I need to modify the file to add some additional information that the executable needs. So I use the following command:
perl -p -i.bak -e 's/log/log,XYZ/g' config.txtI'm expecting the result to be:
0001_832ec657.log,XYZ0002_a7c8eafc.log,XYZHowever, the "config.txt" file is not modified. Using the "-w" option, I get the warning message:
Useless use of a constant in void context at -e line 1.
What am I doing wrong?
- 1This could be the canonical question for how to run Perl one-liners on Windows.Peter Mortensen– Peter Mortensen2019-07-12 19:05:04 +00:00CommentedJul 12, 2019 at 19:05
2 Answers2
Windowscmd.exe does not use' as string delimiters, only". What you're doing is equivalent to:
perl -p -i.bak -e "'s/log/log,XYZ/g'" config.txtso-w is complaining "you gave me a string but it does nothing".
The solution is to use double quotes instead:
perl -p -i.bak -e "s/log/log,XYZ/g" config.txtor to simply leave them off, since there's no metacharacters in this command that would be interpreted bycmd.exe.
Addendum
cmd.exe is just a really troublesome beast, for anybody accustomed tosh-like shells. Here's a few other common failures and workarounds regardingperl invocation.
@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)"
1 Comment
perl -e "print \"Hello, world!\n\"" seems to work.ephemient's answer summarizes the problem well, but you do have another option: change your shell fromcmd.exe to a better shell. If you are a Unix type person then I would suggest looking intoCygwin which provides the sort of environment you are used to (for example,Bash and GNU utilities).
If you are a Windows-type person I would suggest looking atPowerShell (née MSH née Monad). In fact, I would suggest looking into PowerShell even if you are Unix type person. It integrates with.NET and has many neat features (like objects being passed through pipes rather than simple lines of text). If I were stuck on a Microsoft OS, it is the shell I would be using.
Other shells for Windows that people seem to like:
3 Comments
Explore related questions
See similar questions with these tags.
