2

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

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.
4

4 回答 4

3

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

perl -p0777e "s/('|\x22)/&/g" "e:\output.csv"
于 2016-12-29T19:20:11.810 回答
1

您需要担心 cmd.exe 和 perl.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"

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

perl -p0777e s/['\^"]/^&/g "E:\output.csv" > "E:\output2.csv"
perl -p0777e ^"s/['\"]/&/g" "E:\output.csv" > "E:\output2.csv"
于 2016-12-29T21:17:42.300 回答
0

你不需要这么复杂的东西

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

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

如果您只想将单引号或双引号转换为&符号,那么它会更容易

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

或者,使用字符类

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

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

perl -pe "s/['\"]/^&/g" E:\output.csv
于 2016-12-29T18:59:41.587 回答
-1

所以这就是解决这个问题的丑陋。至少没有语法错误。但是,S&R 逻辑没有通过,我将不得不删除破坏逻辑的部分。

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

午饭后回到盐矿……

感谢您尝试@SAM-6!

于 2016-12-29T18:54:04.553 回答