regex - 使用纯 sed 对列进行复杂转置

标签 regex sed pattern-matching

我试了几个小时才找到 this 的解决方案题。显然,不幸的是我没有成功。一个非常棘手的问题。

示例(来自 awk 问题):

  • 输入:

  • 第111话
    第222话
    第 333 章
    第 444 章
    第555话
    ccc 666
  • 输出:

  • aaa 111,222,333
    bbb 444,555
    ccc 666
  • 输入

  • APM00065101435 189
    APM00065101435 190
    APM00065101435 191
    APM00065101435 390
    190104555 00C7
    190104555 00D1
    190104555 00E1
    190104555 0454
    190104555 0462
    APM00065101435 391
    APM00065101435 392
  • 输出

  • APM00065101435 189,190,191,390
    190104555 00C7,00D1,00E1,0454,0462
    APM00065101435 391,392

    我尝试了什么?我的一些非工作示例:
    sed -nr '1{h;b};H;x;/(\S+).*\n\1.*\'/M{x;b};s/.*\'//m;s/\n\S*\s*/,/g;s/,$//;p' 文件
    sed -nr '1{h;b};H;x;h;s/(\S+).*\n(\S+).*\'/\1\n\2/m;/(\S+)\n\1\'/M{$!b;g;bk};g;s/\n.*\'//m;:k;s/^\S+\s//2mg;s/\n/,/g;p;x;s/.*\n//;h;$l' file2
    sed -nr 'H;g;s/(\S+)\s.*/\1/gm;/(\S+)\n\1\'/M{$!b;g;bk};g;1d ;s/\n.*\'//m;:k;s/\n\S+\s/,/2g;s/\n//;p;g;s/\n.*(\n. *)$/\1/;h' file2

    感谢您阅读本文。

    最佳答案

    这可能对你有用(GNU sed):

    sed -r ':a;$!N;s/^(([^ ]+ ).*)\n\2/\1,/;ta;P;D' file
    

    或者,如果您更喜欢:
    sed -r ':a;$!N;s/^((\S+\s).*)\n\2/\1,/;ta;P;D' file
    

    这将 2 行读入模式空间,比较每行的开头,如果它们相同,则用逗号替换与第一行匹配的第二行的开头并重复。如果行不匹配,则打印出第一行。

    关于regex - 使用纯 sed 对列进行复杂转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17414805/

    相关文章:

    java - 带有自定义分隔符的 Spring AntPathMatcher 表现得很奇怪

    java - 模式.编译 ("(.*?):")

    java - 正则表达式除了第一个

    ruby - 使用条件正则表达式从 url 生成文件名

    pattern-matching - 以编程方式比较两行(库存模式匹配)

    java.util.Pattern API "puzzle"

    java - 正则表达式查找持续时间

    linux - 在 procmail 中打印出变量

    linux - 使用 sed 命令时,我收到以下错误 : Function cannot be parsed. 任何解决方案或原因?

    linux - 用于监视磁盘 IO 的 shell 脚本无法正常工作