【问题标题】:Perl & Regex within Windows CMD LineWindows CMD 行中的 Perl 和正则表达式
【发布时间】:2015-06-18 08:49:34
【问题描述】:

有没有办法在一个 cmd 行中完成匹配 + 全部存储?因此,不要将匹配项保存到数组中:即

($matches) = $filecontents =~ m/.../g

...匹配将保存到 *.txt 文件?我已经试验了几天,相信我已经接近解决方案了。但是 Perl 和 Windows CMD Prompt 的一些细微差别使我无法完成这项任务。这是我最近尝试过的:

% perl -p -i.bak -e "m/(?<=")(\d\.\d+)(?=")/g" filename.extension

我是 CMD 系列的初学者,我正在运行 Windows 7(即将切换到 Linux)。显然,我需要指定一个可以保存匹配项的文件。问题是,这是我的知识下降的地方。有人可以帮我解决这个问题吗?任何 cmets 表示赞赏。谢谢!

【问题讨论】:

    标签: regex windows perl


    【解决方案1】:

    如果我理解正确,您想从整个文件中提取所有匹配项,并将这些结果写入单独的文件。

    如果以下结果是您所追求的,这将起作用。我没有要测试的 Windows 框,但这应该可以工作(您可能必须在单线的外部使用双引号并转义内部的双引号,但我不确定。

    这个单行代码在不打印 (-n) 'file.txt' 文件的情况下进行迭代,如果通过命令行重定向在 'results.txt' 文件中存在匹配项,则打印与换行符结合的匹配项:

    perl -ne 'print "$_\n" for m/(?<=")(\d\.\d+)(?=")/g' file.txt > results.txt
    

    输入文件:

    $ cat file.txt
    one
    two "9.162"
    three one "6.3"
    five one six
    

    输出文件:

    $ cat results.txt
    9.162
    6.3
    

    【讨论】:

    • 谢谢你,史蒂夫!显然我的命令行知识是初学者。我一定会熟悉 cmd-line 重定向 ('>')...尽管切换回基于 Unix 的系统可能会更好。
    • 不客气。我刚刚在 Windows 上进行了测试,这可以正确地转义内部引号:perl -ne "print qq{$_\n} for m/(?&lt;=")(\d\.\d+)(?=")/g" file.txt &gt; results.txt。如果这对您有用,请将答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多