Как заменить первое вхождение на sed? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть файл со многими именами: я хочу заменить только первый вывод

sed -i "s/\(name:\).*/\1 ${NEW_VALUE}/" ./myFile

Input
-  martin:
    name: Martin D'vloper
    job: Developer
    skills:
      - python
      - perl
      - pascal
-  tabitha:
    name: Tabitha Bitumen
    job: Developer
    skills:
      - lisp
      - fortran
      - erlang

, чтобы изменить только имя Мартин Д'Влопер

-  martin:
        name: NEW VALUE!!!
        job: Developer
        skills:
          - python
          - perl
          - pascal
    -  tabitha:
        name: Tabitha Bitumen
        job: Developer
        skills:
          - lisp
          - fortran
          - erlang

Все изменилосьnames

Я видел что-то с другим синтаксисом

sed '0,/pattern/s/pattern/replacement/' filename

, но я не могу изменить sed на это, потому что динамическое значение. Не могли бы вы посоветовать мне, как заменить только первый синтаксис?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Это должно делать то, что вы хотите:

sed -i "0,/name:/{s/name:.*/name: ${NEW_VALUE}/}" ./myFile

Сначала он находит name:, а затем выполняет замену, которая заменяет 'name: followed by any characters' (.* означает любую последовательность символов ) с 'name: ${NEW_VALUE}', где NEW_VALUE - ваша динамическая переменная из вашего примера.

Fromman sed

0, addr2

Начинайте в состоянии «совпадающий первый адрес», пока не будет найден addr2.Это похоже на 1, addr2, за исключением того, что если addr2 соответствует самой первой строке ввода, то 0, форма addr2 будет в конце своего диапазона, тогда как форма 1, addr2 все еще будет в начале своего диапазона.Это работает, только когда addr2 является регулярным выражением.

0 голосов
/ 12 февраля 2019

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

sed -i "/\(name:\).*/{s//\1 ${NEW_VALUE}/;:a;n;ba}" ./myFile

Подберите name:, подставьте новое значение, а затем прочитайте и распечатайте оставшуюся часть файла.

Или альтернатива:

sed -z -i 's/\(name:\).*/\1 '"${NEW_VALUE}"'/M' file

Обратите внимание на флаг M команды подстановки, чтобы ограничить .* в строке.

0 голосов
/ 12 февраля 2019

Если вы согласны с awk, попробуйте следующее.

awk '/name/ && ++count==1{sub(/name:.*/,"name: NEW VALUE!!!")} 1'  Input_file

Если у вас есть переменная оболочки и вы хотите добавить ее значение в код awk, попробуйте выполнить следующее.

val="new_vaue"
awk -v value="$val" '/name/ && ++count==1{sub(/name:.*/,"name: "value)} 1'  Input_file

Если вы хотите сохранить вывод в сам файл Input_file, добавьте > temp_file && mv temp_file Input_file к коду выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...