Частичное разделение строки в Bash - PullRequest
0 голосов
/ 01 апреля 2019

Давайте рассмотрим эту строку:

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».Так что может быть «мусор» между 2xx \ токенами.Так что я не могу просто разбить строку на токены, не могу использовать 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 \

1 Ответ

1 голос
/ 01 апреля 2019

Что-то в 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 с отрицательным внешним видом:

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