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

2023-12-05

我有以下文件.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        }

在此文件中的文本部分part 1 (from line 28 till 38) and part 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 中的行顺序不会改变。

我希望我能把我的问题说清楚并提前致谢


With ed如果可用/可接受。

#!/usr/bin/env bash

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

只会将新输出打印到stdout但该文件不会被更改/编辑。改变Q to w if in-place需要编辑。去除,p使输出静音。


With sed

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

注意不同sed使用时版本有不同的语法-i标记如果in-place需要编辑。


根据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

需要 GNUgrep(1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 bash 脚本根据用户输入编辑文件 的相关文章

  • 如何在 grep 中每个文件匹配一次?

    是否有任何 grep 选项可以让我控制匹配总数 但在每个文件的第一个匹配处停止 Example 如果我这样做grep ri include coffee re 我明白了 app coffee express require express
  • 如何在 Bash 脚本中回答“是”

    有一个快速的问题 想象一下我有这样的代码 mkdir p INSTALLDIR sudo apt get install y git clojure leiningen git clone git github com maltoe sto
  • 如何在 Mac OS X 中通过给出进程名称来获取进程的 PID?

    我正在编写一个脚本来监视任何给定进程的 CPU 和 MEM 为此 我需要将要监视的进程的名称作为命令行参数发送 例如 monitorscript
  • 如何为所有用户静默安装 NSIS 可执行文件

    我有一个 NSIS 安装程序可执行文件 我想为所有用户静默安装它 我知道我可以通过 S进行静默安装的参数 问题是安装程序的默认选项是仅为当前用户安装 如何从命令行更改此选项 installer exe S NSIS本身只支持 S NCRC
  • 如何在 Linux Bash 中通过 SFTP 将数据传输到远程文件而不将数据存储在本地文件中?

    我需要能够通过 SFTP 将数据从内存传输到远程文件 我最初是通过 SSH 进行此操作的 在工作时发现我没有对远程位置的 SSH 访问权限 只有 SFTP 访问权限 下面是我的原始 SSH 代码的示例 echo secret data ss
  • 如何防止 Conda 默认激活基础环境?

    我最近在我的 Mac 上安装了 anaconda2 默认情况下 Conda 配置为在我打开新的终端会话时激活基本环境 我想要访问 Conda 命令 即我想要将 Conda 的路径添加到我的 PATHConda 在初始化时会执行此操作 所以没
  • 为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?

    例如 此行失败 nohup for i in mydir fasta do myscript sh i done gt output txt bash syntax error near unexpected token do 正确的做法是
  • npx:shell-auto-fallback 参数已被删除

    老实说 我不记得我最后在我的机器上安装了什么 我相信它正在酝酿 gatsby cli 无论如何 从昨天早上开始 当我打开新实例或重置终端 打开新选项卡 源 zshrc 等 时 我的终端一直给出以下错误 Last login Tue Nov
  • 为什么 iTerm2 中不显示 git 颜色

    所以我有我的 gitconfig 设置来处理颜色 在终端中它工作得很好 看起来也不错 然而 在 iTerm2 中 除非我为 git 设置反向属性 否则我的 gitconfig 根本不会显示颜色 然后它们就出现了 但是谁喜欢相反的颜色呢 为什
  • 运行 shell 命令从 Android 应用程序复制文件

    我正在尝试启动一个应用程序 以便将我的应用程序备份到 SD 卡 我跑 Process p Runtime getRuntime exec su Process c Runtime getRuntime exec cp data app co
  • grep 以特定字符串开头的行

    我想找到文件中以特定字符串开头的所有行 问题是 我事先不知道字符串里有什么 该值存储在变量中 天真的解决方案如下 grep my string file txt 因为如果 Bash 变量my string包含任何正则表达式特殊字符 grep
  • cron 作业不适用于 xwindow

    我在 crontab 中有以下行 1 xeyes 它不显示任何 xwindow 但相反 1 touch somefile txt 工作正常 尝试在谷歌上搜索但没有得到任何具体答案 如果您运行的命令使用 X 服务器 您必须告诉 cron 在哪
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • OS X bash:目录名

    我想创建一个简单的 bash 脚本来在 OS X 上启动 Java 程序 文件名 文件路径和直接工作文件夹都包含空格 当我这样做时 bin sh cd dirname 0 I get usage dirname path 我也尝试过在各种不
  • 当远程(Http)文件更改时如何执行操作?

    我想创建一个脚本 用于检查 URL 并在远程文件的 Last Modified 标头更改时执行操作 下载 解压缩 我考虑过使用curl 获取标头 但随后我必须将其存储在每个文件的某个位置并执行日期比较 有没有人对使用 大部分 标准 UNIX
  • Emacs shell:保存提交消息

    我几天前开始使用 emacs 在 emacs shell M x shell 中使用 git 时遇到问题 当我 git commit 或 git commit amend 时 它会打开 vim 来编辑并保存提交消息 我对此表示同意 但我找不
  • c - 后台运行的程序的退出状态

    我有一个任务 其中我必须创建一个迷你 shell 它能够执行很多操作 包括作业控制 我设法使用 fork 和 execvp 创建新的工作 但我还想获取 execvp 运行的程序的退出代码 根据我从其他帖子中查找到的内容 我可以使用以下方法来
  • Bash IF:多个条件

    我已经尝试让这件事工作几个小时 但我无法让它工作 if P SFTP a PORT 22 P FTPS PORT 990 a PORT 21 then 有人能帮我吗 我知道多个条件可以这样写 if P SFTP PORT 22 then 但
  • 使用sed插入文件内容

    我试图在给定模式之前插入文件内容 这是我的代码 sed i pattern i r scriptPath adapters default permissions xml manifestFile 它添加路径而不是文件的内容 有任何想法吗

随机推荐

  • 求矩阵元素组合的最小和

    昨天我的一位朋友带着一个问题来找我寻求解决方案 问题 我有一个matrix n x m 我需要找出从这些矩阵元素中可以产生的最小总和 条件是 计数只能从左上角的单元格开始 和 应在右下单元格结束 该算法应该计算所有可能的路径 这样我就需要找
  • 返回每个其他元素的列表的方案过程

    虽然我认为我已经完成了 90 但在计划中实现这个程序时遇到了一些麻烦 不幸的是 我需要对此说得有点含糊 因为这是一项家庭作业 我要 A B C D 返回 B D 但我收到一个错误 指出 The object returned as an a
  • SFTP 的 .NET 开源代码? [复制]

    这个问题在这里已经有答案了 我用 google 搜索了很多 但找不到 NET 中 SFTP 的单个开源实现 我得到的只是 SFTP 的第 3 方组件 谁能帮助我在 NET 中实现 SFTP See 这个问题 and shrpssh 这是公认
  • Android - 将文本文件保存到哪里?

    我正在使用 Adob e AIR 构建一个 Android 应用程序 允许用户导入和导出 txt 文件 作为保存 txt 文件的默认路径的最佳文件夹是什么 Thanks 您应该将文件保存在外部 SD 卡上 只需在下面创建一个自己的目录环境
  • Discord.py 如何制作掷骰子命令

    大家好 我正在用 Python 编写一个 Discord 机器人 我想编写一个掷骰子命令 我认为我做错了什么 这是代码 client command async def rolldice ctx dice4 1 2 3 4 dice6 1
  • 如何在 UICollectionViewCell 上设置 UILabel?

    我已经用自定义和标准这样做了几十次UITableView细胞 我所有的插座都已连接 这UILabel是我的子视图UICollectionViewCell在IB中 我的UICollectionViewCell对象继承了身份检查器中正确的类 我
  • jTable单元格背景颜色

    我正在尝试使用渲染器为 jTable 的单元格着色 但它们工作得不好 因为它们滞后于表格并使其无法看到 这是我的代码 TableCellRenderer Tcr jTable1 getCellRenderer x y Component c
  • 循环创建多个数据帧

    我有一个列表 每个条目都是一个公司名称 companies AA AAPL BA YHOO 我想为列表中的每个条目创建一个新的数据框 就像是 伪代码 for c in companies c pd DataFrame 我已经寻找一种方法来做
  • jQuery JSON 到字符串?

    我需要获取我的对象并将其作为表示 JSON 的字符串存储在变量中 而不是使用 JSON json 字符串并使用 parseJSON 我正在处理的库需要格式错误的 JSON 类型 因此我需要对其进行修改才能使其正常工作 最好的方法是什么 Ed
  • 在 C++ 中使用没有伙伴类/Cpp 文件的头文件是否实用

    我最近选择了 C 作为我课程的一部分 并且我试图更深入地了解标头和类之间的合作关系 从我查找过的头文件中的每个示例或教程中 它们都使用带有构造函数的类文件 然后跟进方法 如果包含它们 但是我想知道是否可以只使用头文件来保存一组相关函数 而无
  • 每当串行端口有新数据时,就从串行数据更新 tkinter 标签 python 3.x

    我遇到了这个问题 我无法在标签上显示任何值 只要有新数据从串行端口传入 我就想不断更新它 我是 python 新手 真的需要帮助 import tkinter import tkinter messagebox import serial
  • GLSL 双精度角度、三角函数和指数函数解决方法

    在 GLSL 中 可以找到对双精度变量和运算的基本支持here 然而他们也提到 角度 三角学和指数的双精度版本 不支持功能 有没有一个简单的解决方法 或者我必须从头开始编写自己的函数 这个链接似乎是最好的答案 所以 是的 您需要为这些函数创
  • 查找其他 Android 应用产生了多少网络流量

    我正在尝试制作一个后台服务 该服务应该测量各种应用程序的流量使用情况 以便能够向用户显示哪些应用程序消耗最多的数据流量 我发现 Spare Parts 应用程序正是这样做的 但在 1 6 Dell Streak 设备上安装它后 我总是收到
  • 检查两个 TDateTime 变量

    我正在使用 C Builder 并有以下问题 我想检测一个日期 时间是否晚于另一个日期 时间以及晚了多少 这是我当前的代码 TDateTime testFirstDate 11 09 2012 TDateTime testFirstTime
  • 使用时间在 ggplot2 中添加 vline

    我在向 gplot2 图表添加垂直线时遇到一些问题 下面列出了我的示例数据框 set seed 1234 df lt data frame Date seq as POSIXct 05 00 format H M as POSIXct 23
  • Django 管理员 - 重新身份验证?

    我现在对 Django 的管理后端有点进退两难 默认身份验证系统允许具有员工权限的已登录用户访问管理站点 但它只是让他们直接进入 这对我来说感觉不 正确 我想知道是否很难at least需要对同一会话重新进行身份验证才能进入后端 不过 如果
  • extern "C" 是否会对我的代码施加限制?

    该标准是否规定了有关使用的功能的限制extern C In a 我的问题对其他人来说毫无意义 看来 当我有一个复杂的类 gcc 中断 运行时奇怪 错误 时 如果我调用非默认构造函数 我相信任何带有参数的东西 并且如果它不是 POD 则 ms
  • 如何优雅地终止可观察订阅?

    我正在尝试使用反应式扩展 Rx 来处理数据流 不过 每个元素的处理可能需要一些时间 为了打破处理 我正在使用CancellationToken 这实际上停止了订阅 当请求取消时 我如何优雅地完成当前工作并正确终止而不丢失任何数据 Examp
  • Twitter v1.1:400 错误请求

    我在使用新的 Twitter API 时遇到问题 v1 0 工作正常 但如果我将 URL 更改为 v1 1 我总是收到错误 400 Bad request 通过 Firebug 看到 Example https api twitter co
  • 使用 bash 脚本根据用户输入编辑文件

    我有以下文件 dev 1 DEVICES 2 GLOBAL CONFIG 3 framerate 20000 4 subframes 0 5 max consec timeouts 10 6 max total timeouts 1000