【问题标题】:cut a string in a specific field在特定字段中剪切字符串
【发布时间】:2013-06-01 17:52:38
【问题描述】:
cat test.txt
/one/two/thre.erf;/four/five;4;4
/six/seven/eight.erf;/nine/ten/AABD_CASH_EDBC_FLOW;4;4

期望的输出:

four
nine/ten

这样做:在一行中获取输出 - 问题。

cat test.txt| cut -d ';' -f2 | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}'
/four//nine/ten/

还有更好的方法吗?

【问题讨论】:

  • 我不明白你想要的输出。您产生该输出的一般标准是什么?
  • @Lorkenpeist 如果你读过 OP 的代码,(cat|cut|awk) 你就会知道标准
  • nine/ten 来自哪里?
  • 请仔细检查您的更新,即使您删除了相应的输入,您仍保留了一些所需的输出
  • 抱歉...在编辑时删除了必要的信息。再次更新!!

标签: regex bash sed awk cut


【解决方案1】:

您可以一次获得所需的输出:

awk -F';' '{d=$2;f=$2
        sub(/\/[^/]*$/,"",d)
        sub(/.*\//,"",f)
        a[NR]=d;b[NR]=f}

        END{for(;++i<=NR;)print a[i]
            print ""
            for(;++j<=NR;)print b[j]}' file

将输出:

/four
/nine/ten

five
AABD_CASH_EDBC_FLOW

编辑

没有注意到 OP 改变了问题。这一变化使我上面的答案毫无意义,但它使问题变得容易多了。可以做到的

使用 awk

kent$  awk -F';/' 'sub(/\/[^/]*$/,"",$2)&& $0=$2' file 
four
nine/ten

或仅使用 grep

kent$  grep -Po '^.*?;/\K.*(?=/[^/]*$)' file
four
nine/ten

【讨论】:

    【解决方案2】:

    的一个选项。

    script.vim的内容:

    set backup
    g/^/normal df;x$dF/x
    normal ZZ
    

    像这样运行它:

    vim -S script.vim test.txt
    

    修改文件就地产生:

    four
    nine/ten
    

    并且还会创建一个附加~ 后缀的备份文件,这样可以避免第一次尝试游戏结束。

    【讨论】:

    • 如您所说,这将更改 (ZZ) 原文件。这样OP的第二步就不能再完成了。您可以考虑先将内容拉入寄存器。第一步后,将寄存器粘贴到文件末尾,继续第二步。
    • 糟糕......我没有注意到OP改变了问题......第二步消失了......!!!
    • @Kent:对不起。我不明白你。 OP的第二步是什么意思? cut 命令?我知道对于他想从第一个冒号提取到最后一个正斜杠的每一行?为什么我应该将内容保存在寄存器中?我是不是误会了什么? 编辑好的。全清。看来OP在编辑之间做了很大的改变。
    【解决方案3】:

    GNU sed

    sed 's:^.*;/\(\w*/\w*\).*:\1:;1~2s:/.*::' file
    

    ..输出是:

    four
    nine/ten
    

    【讨论】:

      【解决方案4】:

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

      sed -r 's|[^;]*;/([^;/]*(/[^;/]*)*)/.*|\1|' file
      

      这假定第二个字段中至少有 2 个/

      【讨论】:

        【解决方案5】:
         grep -Po '(?<=;)/[^;]*(?=/)' test.txt
        

        【讨论】:

          【解决方案6】:
          while IFS=';' read -ra fields; do 
              d=$(dirname "${fields[1]}")
              echo "${d#/}"
          done < test.txt
          

          【讨论】:

            猜你喜欢
            • 2013-01-14
            • 2021-01-08
            • 1970-01-01
            • 1970-01-01
            • 2017-07-11
            • 2013-08-26
            • 2017-06-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多