Ошибка SED в случае, если "SED: нет входных файлов" при попытке заменить строки - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь изменить количество реплик в файлах yaml. Мой скрипт находит нужную мне информацию и должен читать текст с клавиатуры, но он пропускает чтение и отправляет мне «sed: no input files». Что я делаю не так? Спасибо за внимание

#!/bin/bash
FILES=./test1/*

for file in $FILES
do
    echo "$file"
    grep -v -e "commonconfigs" -e "commonsecrets" -e "internalurls" $file | grep -w "[^-] name:\|replicas:"
    while IFS= read line
    do
    currentline=$(echo "$line" | grep -o "replicas")
      if  [ "$currentline" == "replicas" ];then
        read -p "replics:" rep
        sed -i 's/replicas:.*/replicas:$rep/g' > "$line"
      fi
    done < "$file"
done

Вывод:

./test1/anal.yaml
  name: anal
  replicas: 1
  name: anal
template:
sed: no input files

Файл примера

apiVersion: apps/v1
kind: Deployment
metadata:
  name: devices-api
spec:
  selector:
  replicas: 1
  template:
    metadata:
        fluentd: "true"
      annotations:
        prometheus.io/scrape: 'true'
    spec:
      containers:
      - name: devices-api
        image:
        imagePullPolicy: "Always"
        resources: {}
        env:
          - name: Swagger__Enabled
            valueFrom:
              configMapKeyRef:
                name: commonconfigs
---

apiVersion: apps/v1
kind: Deployment
metadata:
  selector:
      app: event-jobs
  replicas: 1
  template:

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Следующее утверждение вашего кода является виновным:

do [...] sed -i 's/replicas:.*/replicas:$rep/g' > "$line" [...] done < "$file"

Команда sed , вызываемая с параметром -i , используется для редактирования файла на месте, что невозможно, если вы читаете файл из стандартного ввода (вне do-while l oop).

0 голосов
/ 22 января 2020

Спасибо всем за ответы. Моя проблема будет в моем разборе алгоритма. Я пытаюсь прочитать каждую строку и установить их в седь.

sed -i "$32 s|replicas:.*|replicas: $rep|" $file

Теперь я нашел номер строки с помощью grep, установил их в массив и установил там в sed, где мне нужно что-то изменить

Решение парсинга моих файлов:

#!/bin/bash
FILES=*yaml

for file in $FILES
do
    echo $file
    grep -v -e "commonconfigs" $file | grep -w "[^-] name:\|replicas:"
    nummeric=($(grep -n "replicas" $file | cut -f1 -d:))
    for i in "${nummeric[@]}"; do
      echo $i
      read -p "replicas: " rep
      sed -i "$i s|replicas:.*|replicas: $rep|" $file
    done
done
0 голосов
/ 20 января 2020

Если ваша цель - заменить replicas: в файлах yaml, нет необходимости использовать while или grep. Используйте эту команду sed:

sed "s/\<replicas:.*/replicas: $rep/g" test1/*yaml

Двойные вместо одинарных кавычек допускают расширение параметра $rep. Сначала проверьте это, если вывод выглядит хорошо, используйте параметр sed -i'' для замены файлов.

...