【问题标题】:Matching pattern's nth occurence and delete until another multiple-brackets-expression pattern is found匹配模式第 n 次出现并删除,直到找到另一个多括号表达式模式
【发布时间】:2019-06-18 20:03:54
【问题描述】:

我想编写一个与“%”字符匹配的 shell 脚本并删除所有内容,直到找到特定的字符。 [A-G][a-g][m-n][p-s] 括号中的特定字符范围。 例如,我想将 %0.h2d 更改为 %d

到目前为止,我已经查看了许多解决方案,但没有找到我想要的,尤其是关于多个括号的解决方案。我最初使用以下代码的计划是先隔离字符串,然后再进行删除:

awk '{for(i=1;i<=NF;i++) {if ($i == "%") beginning=i; if($i == [ A-G ] || $i ==    [ a-g ] || $i ==[ m-n ] || $i == [ p-s ]) ending=i }; for (j=beginning;j<=endin    g;j++) printf $j" ";printf "\n" }' .annex/file.c

我的代码语法不正确,我得到的是一堆警告:

awk: syntax error at source line 1
 context is
    {for(i=1;i<=NF;i++) {if ($i == "%") beginning=i; if($i == >>>  [ <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1`

% 出现n 次时,我如何修改此代码或使用另一个代码删除%[A-G] || [a-g] || [m-n] || [p-s] 之间的内容?

【问题讨论】:

    标签: string shell scripting pattern-matching text-processing


    【解决方案1】:

    试试:

    awk '{gsub(/%[^A-Ga-gm-np-s]+/, "%")} 1' .annex/file.c
    

    示例

    考虑这个输入文件:

    $ cat file.c
    fprintf(stdout,"%-20s %0.h2d",a,b)
    fprintf(stderr,"%.3f",c)
    

    让我们运行我们的命令:

    $ awk '{gsub(/%[^A-Ga-gm-np-s]+/, "%")} 1'  file.c 
    fprintf(stdout,"%s %d",a,b)
    fprintf(stderr,"%f",c)
    

    工作原理

    gsub(/%[^A-Ga-gm-np-s]+/, "%") 查找与% 匹配的任何字符串,后跟不在A-Ga-gm-np-s 范围内的字符,并将其替换为仅% .

    仅替换第 n 次出现

    如果您只想替换第 n 次出现,请尝试:

    sed -E 'H;1h;$!d;x; s/%[^A-Ga-gm-np-s]+/%/'"$n"
    

    例如,要替换第二个匹配项,请使用:

    $ n=2; sed -E 'H;1h;$!d;x; s/%[^A-Ga-gm-np-s]+/%/'"$n"  file.c
    fprintf(stdout,"%-20s %d",a,b)
    fprintf(stderr,"%.3f",c)
    

    替换第三个:

    $ n=3; sed -E 'H;1h;$!d;x; s/%[^A-Ga-gm-np-s]+/%/'"$n"  file.c
    fprintf(stdout,"%-20s %0.h2d",a,b)
    fprintf(stderr,"%f",c)
    

    您可以为n 使用任何您喜欢的值。

    工作原理

    • -E 告诉 sed 使用扩展正则表达式(awk 的默认类型)而不是基本正则表达式。

    • H;1h;$!d;x; 告诉 sed 将文件读入模式空间。

      这一系列命令读入整个文件。将其视为成语可能是最简单的。如果你真的想知道血淋淋的细节:

      • H - 追加当前行以保留空间
      • 1h - 如果这是第一行,则覆盖保留空间 有了它
      • $!d - 如果这不是最后一行,删除模式空间 并跳到下一行。
      • x - 交换保持和模式空间以放入整个文件 模式空间
    • 's/%[^A-Ga-gm-np-s]+/%/'"$n" 告诉 sed 替换第 n 次出现的模式。

    【讨论】:

    • 非常整洁。工作得很好,谢谢。您将在哪里插入增量以查找第 n 次出现 %
    • @aboitier 谢谢。另外,我刚刚添加了代码来仅查找和替换第 n 次出现。
    • 多么棒的编辑!脱离图表。感谢所有这些血淋淋的细节以及 sed -Extended 的介绍
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2022-12-17
    • 1970-01-01
    相关资源
    最近更新 更多