vim 正则表达式替换 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
silenceboychen

vim 正则表达式替换

  •  
  •   silenceboychen Sep 23, 2021 2534 views
    This topic created in 1680 days ago, the information mentioned may be changed or developed.

    有一批类似这样的数据:

    ('526440130559344640','2',7,to_date('2020-11-18 00:00:00','yyyy-mm-dd hh24:mi:ss'),'0',null,null,to_date('2020-11-26 01:48:39.705','yyyy-mm-dd hh24:mi:ss')), ('526440158212390912','2',3,to_date('2020-11-18 00:00:00','yyyy-mm-dd hh24:mi:ss'),'0',null,null,to_date('2020-11-26 01:48:39.705','yyyy-mm-dd hh24:mi:ss')), 

    如何使用正则表达式批量将里边的 to_date 这一段,

    to_date('2020-11-26 01:48:39.705','yyyy-mm-dd hh24:mi:ss') 

    提取出里边的日期,并替换掉这一段内容

    to_date('2020-11-26 01:48:39.705','yyyy-mm-dd hh24:mi:ss') => '2020-11-26 01:48:39.705' 

    最终数据变为下边的格式

    ('526440130559344640','2',7,'2020-11-18 00:00:00','0',null,null,'2020-11-26 01:48:39.705'),('526440158212390912','2',3,'2020-11-18 00:00:00','0',null,null,'2020-11-26 01:48:39.705'), 
    11 replies    2021-09-24 09:42:05 +08:00
    ruchee
        1
    ruchee  
       Sep 23, 2021
    首先你需要安装一个插件:eregex,因为 Vim 自带的正则太弱了

    然后就是一个命令的事了

    :%S/^[^']*?'(\d{4}.*?)'.*$/\1/g
    ruchee
        2
    ruchee  
       Sep 23, 2021
    鉴于楼主又修改了帖子内容,新的命令如下

    :%S/to_date\(('\d{4}[^']*?'.*?)\)/\1/g
    ruchee
        3
    ruchee  
       Sep 23, 2021   1
    上一个命令疏忽了一点,最终解

    :%S/to_date\(('\d{4}[^']*?').*?\)/\1/g
    2i2Re2PLMaDnghL
        4
    2i2Re2PLMaDnghL  
       Sep 23, 2021
    s/todate(\('[^']\+'\),[^)]\+)/\1/g
    这个是非常特化的,如果第二个字符串里有 `)` 就会出错
    毕竟没人用 vim 自动化不是嘛(
    自动化还是 ast 求值吧。
    ETiV
        5
    ETiV  
       Sep 23, 2021 via iPhone   3
    是有多想不开才会用 vim 去做正则替换…

    sed -i 可以修改原始文件,带一个参数还能备份原始文件
    Kasumi20
        6
    Kasumi20  
       Sep 23, 2021
    就是,写一个 js 程序去处理不是很轻松吗
    glacial
        7
    glacial  
       Sep 23, 2021
    ```java
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class Example {
    public static void main(String[] args) {
    final String regex = "to_date\\((.*?),(.*?)\\)";
    final String string = "('526440130559344640','2',7,to_date('2020-11-18 00:00:00','yyyy-mm-dd hh24:mi:ss'),'0',null,null,to_date('2020-11-26 01:48:39.705','yyyy-mm-dd hh24:mi:ss')),\n"
    + "('526440158212390912','2',3,to_date('2020-11-18 00:00:00','yyyy-mm-dd hh24:mi:ss'),'0',null,null,to_date('2020-11-26 01:48:39.705','yyyy-mm-dd hh24:mi:ss')),";
    final String subst = "$1";

    final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
    final Matcher matcher = pattern.matcher(string);

    // The substituted value will be contained in the result variable
    final String result = matcher.replaceAll(subst);

    System.out.println("替换结果: " + esult);
    }
    }
    ```
    HiHi
        8
    HiHi  
       Sep 23, 2021
    %s/to_date(\('[^']*'\),[^)]*)/\1/g
    jaredyam
        9
    jaredyam  
       Sep 23, 2021
    随便一个脚本语言写两句也没那么费事吧
    jaredyam
        10
    jaredyam  
       Sep 23, 2021
    刚才测试了一下 sed,似乎符合你的预期:

    sed -E 's/to_date\(([^,]*),([^,)]*)\)/\1/g' <text>

    如果没问题就加个-i,inplace 操作
    gy0624ww
        11
    gy0624ww  
       Sep 24, 2021
    其实楼主就是想问正则吧。sed vim 和脚本 都是正则的不同调用方式
    About     Help     Advertise     Blog     API     FAQ     Solana     2670 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 62ms UTC 03:44 PVG 11:44 LAX 20:44 JFK 23:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86