使用运行 perl s/("|')// 命令的 windows batch file/command 行,如何防止在操作员预期错误的位置找到裸词?

using a windows batch file/command line that runs a perl s/("|')// command, how to do prevent a bareword found where operator expected error?

我已阅读其他帖子,但不知为何解决方案不起作用。

perl -p0777e "s/('|"")/^&/g" "E:\output.csv" > "E:\output2.csv"

我试过了

perl -p0777e "s/('|^")/^&/g" "E:\output.csv" > "E:\output2.csv"
perl -p0777e "s/('|\")/^&/g" "E:\output.csv" > "E:\output2.csv"

我尝试将所有其他可能的有趣字符与转义字符放在一起,但没有成功。我知道问题出在 " 字符上,因为我在同一个 FOR 循环中 运行 这个 perl 命令的变体。

这是最上面语法的错误消息:

Bareword found where operator expected at -e line 1, near "s/('|")/^&/g E"
syntax error at -e line 1, near "s/('|")/^&/g E"
Execution of -e aborted due to compilation errors.

我无法判断 E 是否包含在内是因为接近度还是因为 " 混淆。我可以对此进行试验。

谁能帮我弄清楚如何安全地传递这个 S&R 命令?提前谢谢你。

编辑:我什至无法正确评论...

最近一次尝试是

perl -p0777e "s/^(^'^|^"^)/^&/g" "E^:\output.csv" > "E:\output2.csv"

没有成功。错误消息是

Bareword found where operator expected at -e line 1, near "s/^(^'^|^)/&/g E"
syntax error at -e line 1, near "s/^(^'^|^)/&/g E" Execution of -e aborted
due to compilation errors.

所以这是解决这个问题的丑陋之处。至少没有语法错误。然而,S&R逻辑并没有贯彻到底,我将不得不删除破坏逻辑的部分。

perl -p0777e ""s^/^(^'^|""^)^/^&^/g"" "E:\output.csv" > "E:\output2.csv"

午饭后回到盐矿...

感谢您试用@SAM-6!

你不需要那么复杂的东西

但是你想做什么?这会将所有单引号 ' 或双引号对 "" 转换为单个 & 符号 &

perl -0777 -pe "s/('|\"\")/&/g" E:\output.csv

如果您只想将单引号或双引号转换为 & 符号,那就更简单了

perl -0777 -pe "s/('|\")/^&/g" E:\output.csv

或者,使用字符 class

perl -0777 -pe "s/['\"]/^&/g" E:\output.csv

但是你为什么要吞掉整个文件?一行一行就好了,像这样

perl -pe "s/['\"]/^&/g" E:\output.csv

最简单的处理方法是删除有问题的引号字符

perl -p0777e "s/('|\x22)/&/g" "e:\output.csv"

cmd.exe 和 perl.exe 都需要担心 escaping/quoting 个字符,而且规则不同。

cmd.exe

&| 等毒字符必须被引用为 "&",或者转义为 ^& 如果它们被解释为文字cmd.exe.

双引号是一种状态机 - 第一个未转义的引号打开引号,下一个将其关闭。引号可以转义为 ^" 以防止引号语义打开,但一旦打开,引号就无法转义以防止其关闭引号。

如果有奇数个引号,则其中一个必须被转义,否则引号语义将在最后一个引号之后继续。

perl.exe

双引号文字必须转义为 \"

合并

如果 cmd.exe 和 perl.exe 都需要对引号进行转义,您必须记住首先应用 cmd.exe 转义。所以插入符号必须直接放在引号前面,例如 \^"。在 cmd.exe 删除插入符转义后,perl 只看到 \".

因此,使用以上信息,以下任何一项都应该有效。

perl -p0777e s/('^|\^")/^&/g "E:\output.csv" > "E:\output2.csv"
perl -p0777e "s/('|\")/^&/g^" "E:\output.csv" > "E:\output2.csv"
perl -p0777e ^"s/('^|\")/&/g" "E:\output.csv" > "E:\output2.csv"

你不应该要求括号

perl -p0777e s/'^|\^"/^&/g "E:\output.csv" > "E:\output2.csv"
perl -p0777e "s/'|\"/^&/g^" "E:\output.csv" > "E:\output2.csv"
perl -p0777e ^"s/'^|\"/&/g" "E:\output.csv" > "E:\output2.csv"

另一种选择是使用字符 class 而不是交替

perl -p0777e s/['\^"]/^&/g "E:\output.csv" > "E:\output2.csv"
perl -p0777e ^"s/['\"]/&/g" "E:\output.csv" > "E:\output2.csv"