使用 bash 脚本根据用户输入编辑文件

Edit a file based on user's input using bash script

我有以下file.dev

        1 DEVICES {
        2            GLOBAL-CONFIG {
        3               framerate = "20000";
        4               subframes = "0";
        5               max_consec_timeouts = "10";
        6               max_total_timeouts = "1000";
        7               schedmode = "Standard";
        8               clustermode = "Standard";
        9           }
        10           IO-DEVICES {
        11            }
        12           COMPUTING-DEVICES {
        13                RT_WORKSTATION FDT-C-XM-0120 = {
        14                    hostname = "FDT-C-XM-0120";
        15                    ipaddress = "fdt-c-XM-0120.fdtel.exter";
        16                    DISPLAYS {
        17                        main = "FDT-C-XM-0120:0.0";
        18                    }
        19                    SCHEDPARAM {
        20                        active = "0";
        21                        framerate = "20000";
        22                        subframes = "0";
        23                        max_consec_timeouts = "10";
        24                        max_total_timeouts = "1000";
        25                    }
        26                }
        27              
        28              RT_HOST fdt-c-agx-0008 = { 
        29                    hostname = "fdt-c-agx-0008";
        30                    ipaddress = "fdt-c-agx-0008";
        31                    SCHEDPARAM {
        32                        active = "0";
        33                        framerate = "20000";
        34                        subframes = "0";
        35                        max_consec_timeouts = "10";
        36                        max_total_timeouts = "1000";
        37                    }
        38                }
        39              
        40    #             RT_HOST fdt-c-agx-0003 = { 
        41    #                    hostname = "fdt-c-agx-0003";
        42    #                   ipaddress = "fdt-c-agx-0003.fdtel.exter";
        43    #                    SCHEDPARAM {
        44    #                        active = "0";
        45    #                        framerate = "20000";
        46    #                        subframes = "0";
        47    #                        max_consec_timeouts = "10";
        48    #                        max_total_timeouts = "1000";
        49    #                    }
        50    #                }
        51            }
        52        }

在此文件中,文本部分 第 1 部分 (from line 28 till 38)第 2 部分 (from line 40 till 50) 是用户之间切换。正如我们所见,第 2 部分被注释掉,第 1 部分处于活动状态。

所以我正在尝试使用 bash 脚本自动执行此操作,用户只需输入他想要的部件号,而另一个被注释掉。这样使用一定不要注释掉每一行。

# example
if [ "$userEntry" = "part2"]
then
deactivate part one by typing adding from line 28 till 38 and activate part 2 by removing the # 

输出看起来像

        1 DEVICES {
        2            GLOBAL-CONFIG {
        3               framerate = "20000";
        4               subframes = "0";
        5               max_consec_timeouts = "10";
        6               max_total_timeouts = "1000";
        7               schedmode = "Standard";
        8               clustermode = "Standard";
        9           }
        10           IO-DEVICES {
        11            }
        12           COMPUTING-DEVICES {
        13                RT_WORKSTATION FDT-C-XM-0120 = {
        14                    hostname = "FDT-C-XM-0120";
        15                    ipaddress = "fdt-c-XM-0120.fdtel.exter";
        16                    DISPLAYS {
        17                        main = "FDT-C-XM-0120:0.0";
        18                    }
        19                    SCHEDPARAM {
        20                        active = "0";
        21                        framerate = "20000";
        22                        subframes = "0";
        23                        max_consec_timeouts = "10";
        24                        max_total_timeouts = "1000";
        25                    }
        26                }
        27              
        28  #           RT_HOST fdt-c-agx-0008 = { 
        29  #                  hostname = "fdt-c-agx-0008";
        30  #                  ipaddress = "fdt-c-agx-0008";
        31  #                  SCHEDPARAM {
        32  #                      active = "0";
        33  #                      framerate = "20000";
        34  #                      subframes = "0";
        35  #                      max_consec_timeouts = "10";
        36  #                      max_total_timeouts = "1000";
        37  #                  }
        38  #              }
        39              
        40                  RT_HOST fdt-c-agx-0003 = { 
        41                        hostname = "fdt-c-agx-0003";
        42                       ipaddress = "fdt-c-agx-0003.fdtel.exter";
        43                        SCHEDPARAM {
        44                            active = "0";
        45                            framerate = "20000";
        46                            subframes = "0";
        47                            max_consec_timeouts = "10";
        48                            max_total_timeouts = "1000";
        49                        }
        50                    }
        51            }
        52        }

请注意,file.dev 中的行顺序不会更改。

我希望我能把我的问题说清楚,谢谢

ed如果是available/acceptable.

#!/usr/bin/env bash

if [[ "$userEntry" == "part2" ]]; then
  printf '%s\n' '40,50s/^[[:blank:]]*#//' '28,38s/^/#/' ,p Q |
  ed -s file.txt
fi

只会将新输出打印到 stdout,但文件不会是 change/edited。如果需要 就地 编辑,请将 Q 更改为 w。删除 ,p 以使输出静音。


sed

sed '40,50s/^[[:blank:]]*#//;28,38s/^/#/' file.txt

请注意,如果需要 就地 编辑,则在使用 -i 标志时,不同的 sed 版本具有不同的语法。


根据 OP 的解释。

#!/usr/bin/env bash

part1=28
part2=40

if [[ "$userEntry" == "part2" ]]; then
  if [[ $(grep -nm1 \# file.txt | cut -d':' -f1) == "$part2" ]]; then
     sed '40,50s/^[[:blank:]]*#*//;28,38s/^/#/' file.txt
  else
     sed '28,38s/^/#/' file.txt
  fi
elif [[ "$userEntry" == "part1" ]]; then
  if [[ $(grep -nm1 \# file.txt | cut -d':' -f1) == "$part1" ]]; then
     sed '28,38s/^[[:blank:]]*#*//;40,50s/^/#/' file.txt
  else
     sed '40,50s/^/#/' file.txt
  fi
fi

需要 GNU grep(1)