【问题标题】:Partial String split in Bash部分字符串在 Bash 中拆分
【发布时间】:2019-04-01 18:05:32
【问题描述】:

让我们考虑这个字符串:

00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\00x\00x\00x\

我要检索的是这样的:

00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\

基本上,逻辑是:

  1. 只要是 00x\ 继续读取字符串的剩余部分。

  2. 只要不是 00x\ 继续读取字符串的剩余部分。 在那里分开。

如何在 bash 中实现这一点?注意中间有一个“9”和一个“t”。因此 2 00x\ 令牌之间可能存在“垃圾”。所以我不能只将字符串拆分为标记,不能使用 cut (不是固定长度)。我可以用 awk 或 sed 做什么魔法?

谢谢。

编辑:输入的字符串可以在00x\之后的其他唱。像这样:00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\00x\00x\00x\00x\00x\00x\00x\00x\00x\GL7Dx\00x\00x\00x \00x\00x\00x\00x\00x\00x\00x\BCx\V6Ax\00x\00x\00x\00x\00x\00x\00x\00x\00x\00x\H50x\ 其中我想要的仍然是00x\00x \00x\00x\00x\00x\00x\00x\00x\g09x\t20x\

【问题讨论】:

    标签: string bash split partial


    【解决方案1】:

    awk 中的一些东西:

    $ awk '
    BEGIN {
        FS=ORS="\\"
    }
    {
        for(i=1;i<=NF;i++)
            if(($i=="00x")&&p!="00x"&&p!="") {
                printf "\n"
                exit
            } else {
                p=$i
                print $i
            }
    }' file
    

    更新数据的输出

    00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\
    

    在 perl 中使用否定的lookbehind:

    $ perl -ne 's/(?<!00x)\\00x.*/\\/g;print' file
    00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\
    

    【讨论】:

    • 谢谢。这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2016-05-30
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多