Заменить n-ую строку соответствия с sed - PullRequest
1 голос
/ 06 марта 2019

У меня есть скрипт, который выводит около 50 строк, и примерно пять строк совпадают, когда я пытаюсь заменить только одну из них.

Пример:

...
metadata
 name: A
...
spec:
- labels:
...
    name: B
  name: C
- labels:
...
    name: D
  name: E

Я пытаюсь использовать sed для замены всего «name: B» на «name: {firstVar}» и «name: D» на «name: {secondVar}». Я знаю, что могу просто искать всю строку «name: B» или «name: D», но они не всегда будут одинаковыми и могут быть изменены другими. Единственное, что соответствует, это их размещение. Итак, я ищу возможность заменить 2-е и 4-е совпадение, но каждый раз, когда я пытаюсь использовать «s / name:. * / Name: {firstVar} / 2» или что-то подобное, это не работает, или оно заменит все совпадения. .

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

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

second="firstVar" fourth="secondVar"
sed -z 's/\(name:\s*\)[^\n]*/\1'"$second"'/2;s//\1'"$fourth"'/4' file

Установить переменные в оболочке, а затем использовать их как замены в подстановках сопоставления с образцом.Флаг положительного целого числа в команде замещения заменяет этот числовой шаблон в пространстве шаблонов.Опция -z убирает весь файл в память, и, таким образом, пространство шаблона содержит весь файл.

0 голосов
/ 06 марта 2019

Вот один в awk:

$ awk '
BEGIN {
    a[2]="firstVar"                                  # define the pairs
    a[4]="secondVar"
} 
$1=="name:" {                                        # search for match
    sub($1 " " $2,$1 " " ((++i in a)?a[i]:$2),$0)    # replace
}1' file

Выход:

...
metadata
 name: A
...
spec:
- labels:
...
    name: firstVar
  name: C
- labels:
...
    name: secondVar
  name: E
...