【问题标题】: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 s/("|')// 命令的 Windows 批处理文件/命令行,如何防止在操作员预期错误的位置找到裸字?
【发布时间】:2023-03-13 17:15:01
【问题描述】:

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

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.

【问题讨论】:

    标签: perl batch-file escaping syntax-error bareword


    【解决方案1】:

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

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

    【讨论】:

    • 这行得通。 Tbf 到其他帖子,我意识到我正在使用错误的输出文件检查逻辑,但是一旦我修复了它并删除了所有转义字符,它在语法和逻辑上都是正确的。非常感谢您保存了我 2016 年的最后一部作品!
    • @Borodin,是的,\" 更清晰,但是你有三个解析器(cmd,参数解析器,正则表达式解析器)“战斗” 来处理引用数据开始/结束和特殊字符。在这种情况下,clearer 仍然会产生问题。
    【解决方案2】:

    你需要担心 cmd.exe 和 perl.exe 的转义/引用字符,并且规则不同。

    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"
    

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

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

    【讨论】:

      【解决方案3】:

      你不需要这么复杂的东西

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

      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
      

      【讨论】:

      • if ' or " then replace with &. 它仍然没有替换输出中的单引号或双引号。但我将尝试其他一些建议,例如使用十六进制/八进制表示法.
      • @noobuserpm:我的代码替换了单引号,但只替换了 pairs of 双引号。我已经更新了它。这对你有用吗?
      • 对我来说尝试它是微不足道的(是的脚本),但它没有工作。它从输出文件开始流式传输。这是很多文字。不知道那里出了什么问题,但既然我有答案,我会放过这个。不过感谢您的尝试。
      • @noobuserpm:我认为很明显我只是省略了输出的重定向以避免混淆解决方案。如果你想把你的数据发送到一个文件,那么你应该写perl -pe "s/['\"]/^&/g" E:\output.csv > E:\output2.csv
      • 这就是我跑的。我只更改了“搜索”字段。我保持 I/O 选项与我原来的相同。它开始流式传输到 cmd 窗口,这是新行为。
      【解决方案4】:

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

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

      午饭后回到盐矿……

      感谢您尝试@SAM-6!

      【讨论】:

      • 这不应该是必要的:你已经转义的字符比你需要的要多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 2017-11-30
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多