【问题标题】:Regex with substitutions using sed|awk and groups使用 sed|awk 和组进行替换的正则表达式
【发布时间】:2015-04-15 23:13:30
【问题描述】:

我有这个输入文本

16789248,16789759,"AS24155 Asia Pacific Broadband Wireless Communications Inc"

我想要这段文字

"AS24155","Asia Pacific Broadband Wireless Communications Inc"

这个正则表达式匹配

 /(.*)(AS\d+)(\s)([^"]+).*/g

用这个替换"$2","$4"

我必须处理 300k 行,如果我能够使用基于 linux 的命令行实用程序(如 sed 或 awk),那将是最好的……但即使正则表达式似乎在其他地方匹配,我仍然没有匹配或匹配。

我应该使用不同的东西吗?

【问题讨论】:

    标签: regex linux awk sed


    【解决方案1】:

    sed -r 可以通过一些修改来处理它:[0-9] 代替 \d<space> 代替 \s。没有真正的理由来捕获第一部分和第三部分,所以我删除了这些组。

    sed -r -e 's/.*(AS[0-9]+) ([^"]+).*/"\1","\2"/'
    

    或者,如果您想完全匹配这些字符类,请使用 [[:digit:]] 对应 \d[[:space:]] 对应 \s

    sed -r -e 's/.*(AS[[:digit:]]+)[[:space:]]([^"]+).*/"\1","\2"/'
    

    或者,您可以使用csvtool,它比sed 更适合解析CSV 文件的工作。

    csvtool col 3 input.txt | while read number name; do
        printf '"%s","%s"\n' "$number" "$name"
    done
    

    【讨论】:

      【解决方案2】:
      sed 's/[^"]*"/"/;s[[:space:]]/","/'
      

      基于您的样本,避免分组问题

      【讨论】:

        【解决方案3】:

        sed 是最好的选择,但仅供参考,您可以在 GNU awk 中使用几乎完全相同的 RE 来完成这项工作:

        $ awk 'match($0,/.*(AS[0-9]+)\s([^"]+).*/,a){printf "\"%s\",\"%s\"\n", a[1], a[2]}' file
        "AS24155","Asia Pacific Broadband Wireless Communications Inc"
        

        您的原始命令可能失败了,因为只有一些工具接受 \s 而不是 [[:space:]],几乎没有接受 \d 而不是 [[:digit:]](或 [0-9])。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-04
          • 2021-12-31
          • 2018-08-22
          • 2013-01-04
          相关资源
          最近更新 更多