【问题标题】:Perl + one-liner smart Perl command, in place grep to match unusual characters + full matchPerl + 单行智能 Perl 命令,用 grep 匹配异常字符 + 完全匹配
【发布时间】:2010-11-17 19:19:47
【问题描述】:

主题:one-liner 智能 Perl 命令而不是简单的 grep(在 Bash 脚本中)

我在使用 grep 匹配异常字符时遇到问题(我不能在每个异常字符前加上“\”,因为这很成问题,而且不是一个聪明的解决方案)。

我需要与 $Some_string 中定义的所有不可用字符完全匹配的 Perl 单行语法。示例:

Examples

Some_string="[234-094]"
Some_string="[ * ( & % @ !]"
Some_string="~ [ 0:3 # % & ^ + =]"
Some_string="1.1.1.1.-9.9.9.9   + 9999.999.1 – 10000"
Some_string="< { [ ' : ; " ? / . , "
Some_string="PORT.A.B.C.D – 124.543.455.33 – [ ! NOT EQUAL PORT 38737 – 3837652"
.
.
.

我的 grep 语法不好

 cat  file | grep $Some_string

使用 Perl(我需要以下正确的建议/解决方案):

 cat file | perl -nle 'print if /$Some_string/'

规则

备注:如果 Some_string="111.111.111.111" 在文件中我有 1111.1111.1111.1111 那么 Perl 语法需要忽略这一点。 只有当我在文件中有这个时,Perl 才必须匹配: 111.111.111.111 。

第二点:if Some_string="WORD" 在我的文件中: ONEWORD 那么 Perl 语法需要忽略这一点。 只有当我在文件中有这个时,Perl 才必须匹配:WORD

【问题讨论】:

    标签: perl


    【解决方案1】:

    我不确定我是否完全理解您的问题。也许-P-x 做你想做的事,同时引用"$Some_string" 来保留空格?

    grep -Px "$Some_string" file
    

    来自 grep 手册页:

    -P, --perl-regexp

    将 PATTERN 解释为 Perl 正则表达式。

    -x, --line-regexp

    只选择那些与整行完全匹配的匹配项。

    【讨论】:

    • 请指教 perl ,我认为 perl 更安全
    • 您需要更好地解释您的问题。我不明白您要做什么,也不明白 Perl 将如何提供帮助。请添加一些示例或其他内容。
    • 请参阅 Some_string 示例,我需要执行 cat 文件并匹配 $Some_string,但仅使用 perl - 一行语法,另请参阅我的最后一句话
    • 像这样:猫文件 | perl ……../$Some_string/
    • @jon:你知道quotemeta(),或者它的双引号字符串转义版本\Q...\E吗?
    【解决方案2】:

    你必须以某种方式转义字符串。在这种情况下,需要使用\ 转义特殊字符,因为将字符串传递给 Perl 与将其传递给 grep 并没有什么不同——两者都会在 shell 处理后看到字符串。

    使用 Perl 执行此操作只会混淆您的代码。

    【讨论】:

    • 对不起,我不想与“\”一起使用,请关于 perl 的建议。
    • 你别无选择。如果您要将这些特殊字符传递给 perl,您仍然必须转义它们
    • 我不这么认为,因为 perl 有特殊的 re 可以忽略不可用的字符
    • 是的,但是您仍然必须将包含字符的字符串传递给 perl。如果您使用 shell 想要解释的字符(如 "),您仍然必须转义它们。
    • perl -nle 'BEGIN { $pat = shift || die } print if /\Q$pat/' pattern_with_ugly_things_in_it file1 file2 file666
    【解决方案3】:

    你可以这样做:

    perl -ne 'print if m|\Q[ * ( & % \E\@\Q !]\E|' file
    

    我在 Quote and Quote-like Operators 中找到了 \Q 和 \E 运算符。

    来自该链接的 sn-p:

    您不能在 \Q 序列中包含文字 $ 或 @。未转义的 $ 或 @ 会插入相应的变量,而转义将导致插入文字字符串 \$。您需要编写类似 m/\Quser\E@\Qhost/ 的内容。

    \Q  Quote (disable) pattern metacharacters till \E or
        end of string
    
    \E  End either case modification or quoted section
        (whichever was last seen)
    

    【讨论】:

    • hi - 无法识别的开关:-E(E 标志在 perl 语法中无效)
    • 它在 Perl v5.28.1 (stock Ubuntu 19.10) 上运行良好。输出是一行,Some_string="[ * ( &amp; % @ !]"。虽然它也似乎在那一行之后有一个空行。
    猜你喜欢
    • 2020-04-20
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多