Вставьте текст перед последней строкой между двумя совпадениями в sed или awk - PullRequest
1 голос
/ 25 октября 2019

У меня такой файл:

subset {
    set {
        type "car"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
    }

это может повторяться просто с разными "типами"

Я бы хотел вставить что-то прямо перед последним} в "наборе""

Таким образом, это выглядело бы так (не уверен, что awk или sed могут каким-то образом определить, сколько пробелов имеет строка раньше: D):

subset {
    set {
        type "car"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
        something
    }

Я могу сопоставить ее с

sed "/type.*.car.*/,/\} .... something here..."

файл Я просто не могу понять ... Я не могу искать "колеса", поскольку это может быть что-то другое. Любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Это может сработать для вас (GNU sed):

sed '/\<type\>.*\<car\>/{h;:a;n;/^\s*}/!ba;x;s/\S.*/something/;G}' file

Найдите строку, содержащую требуемый type, скопируйте эту строку и затем читайте / печатайте последующие строки до тех, которые начинаются с правойизогнутая скобка. Вернитесь к скопированной строке и замените все из первого непробела на требуемую строку, добавьте строку, содержащую правую фигурную скобку, и выведите результат.

0 голосов
/ 25 октября 2019

Вот еще один awk скрипт (стандартный gawk для Linux).

script.awk

/ +set {/,/ +}/{
    if($0 ~ /type "car"/ ) f = 1; 
    if($0 ~ / +}/ && f == 1) {
        print "        something";
        f = 0;
    }
}1

input.txt

subset {
    set {
        type "car"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
    }
    set {
        type "baot"
        product "nice"
        dealer "here"
        features "1"
        wheels 0
    }
    set {
        type "horse"
        product "too"
        dealer "very"
        features "2"
        wheels 0
    }
}

работает:

awk -f script.awk input.txt

вывод:

subset {
    set {
        type "car"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
        something
    }
    set {
        type "baot"
        product "nice"
        dealer "here"
        features "1"
        wheels 0
    }
    set {
        type "horse"
        product "too"
        dealer "very"
        features "2"
        wheels 0
    }
}
0 голосов
/ 25 октября 2019

Дано:

subset {
    set {
        type "car"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
    }
    set {
        type "second"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
    }

Если вы хотите добавить «что-то» только тогда, когда «type» car », запустите:

perl -0777 -ape 's/set\h*{[^}]*type "car"[^}]*\K(?=\n\h+})/\n\tsomething/g' file.txt 
subset {
    set {
        type "car"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
        something
    }
    set {
        type "second"
        product "ww"
        dealer "something"
        features "0"
        wheels 4
    }

Объяснение:

s/          # substitute
  set           # literally
  \h*           # 0 or more horizontal spaces
  {             # opening curly brace
  [^}]*         # 0 or more non curly brace
  type "car"    # literally
  [^}]*         # 0 or more non curly brace
  \K            # forget all we have seen until this position
  (?=\n\h+})    # positive lookahead, make  sure we have after a linefeed and some horizontal spaces and a closing curly brace
/           # with
  \n            # linefeed
  \t            # a tab
  something     # whatever you want
/g          # end subs, global
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...