代码之家  ›  专栏  ›  技术社区  ›  Cory Klein

将正则表达式中的所有字符替换为另一个字符?[复制]

  •  2
  • Cory Klein  · 技术社区  · 7 年前

    file.txt :

    Hello there Cory Klein
    Have fun
    Hello there Samantha Rodgers
    

    XXXXX 很容易 sed :

    $ sed -e "s/\(Hello there \).*/\1XXXXX/" file.txt
    Hello there XXXXX
    Have fun
    Hello there XXXXX
    

    但我想替换 用一个 X 性格,像这样:

    Hello there XXXX XXXXX
    Have fun
    Hello there XXXXXXXX XXXXXXX
    

    如何将与正则表达式匹配的所有字符替换为另一个字符?

    任何常规的POSIX工具都可以 塞德 awk , perl 我确信我可以编写一个简单的python脚本来实现这一点,但是我很好奇单独使用regex是否可行,这可能会更简洁。如果是这样的话,我很想知道如何在将来把这个概念应用到其他地方。

    2 回复  |  直到 7 年前
        1
  •  2
  •   revo shanwije    7 年前

    使用sed,您需要过滤掉不包含 Hello there 使用地址:

    /Hello there/{...}
    

    你好啊 x :

    s/(^.*Hello there *)?[^[:space:]]/\1x/g
    

    我们要走了 以及它前面的字符 \1 .

    $ sed -r '/Hello there/{s/(^.*Hello there *)?[^[:space:]]/\1x/g}' file
    Hello there xxxx xxxxx
    Have fun
    Hello there xxxxxxxx xxxxxxx
    
        2
  •  1
  •   revo shanwije    7 年前

    Perl支持其正则表达式集的高级功能,因此使用Perl可以缩短时间:

    perl -pe 's/(Hello there|\G(?!\A)) *\K\S/x/g' file
    

    看到了吗 live demo here

    RegExp分解:

    • (
      • Hello there 匹配
      • | 或者
      • \G(?!\A)
    • ) 分组结束
    • [ ]* 匹配任何空格
    • \K 忘记目前为止匹配的结果
    • \S

    这将继续匹配后面的所有非空白字符 你好啊 并用 x 使用 g