【问题标题】:Sed error in if "sed: no input files" when try replace lines尝试替换行时,如果“sed:没有输入文件”出现 Sed 错误
【发布时间】:2020-05-06 17:01:55
【问题描述】:

我尝试更改 yaml 文件中的副本数。我的脚本查找需要我的信息,并且必须从键盘读取文本,但他跳过读取并向我发送“sed:无输入文件”。我做错了什么?谢谢关注

#!/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:

【问题讨论】:

    标签: bash for-loop sed while-loop sh


    【解决方案1】:

    你的代码的下一个语句是有罪的:

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

    使用选项 -i 调用的 sed 命令用于就地编辑文件,如果您从标准输入(外部do-while 循环)。

    【讨论】:

      【解决方案2】:

      如果您的目标是替换 yaml 文件中的replicas:,则无需使用whilegrep。使用这个sed 命令:

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

      双引号而不是单引号允许$rep 的参数扩展。先测试一下,如果输出看起来不错,使用 sed -i'' 选项替换文件。

      【讨论】:

        【解决方案3】:

        感谢大家的回答。我的问题在于我的算法解析。我尝试阅读每一行并将它们设置为 sed 。

        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
        

        【讨论】:

          猜你喜欢
          • 2015-06-18
          • 2019-07-09
          • 2021-04-29
          • 2016-05-27
          • 1970-01-01
          • 2012-06-14
          • 2023-03-15
          • 1970-01-01
          • 2011-11-01
          相关资源
          最近更新 更多