【问题标题】:Changing contents of a file through shell script通过 shell 脚本更改文件的内容
【发布时间】:2020-08-04 19:53:59
【问题描述】:

我有一个要求,我需要更改文件的内容,比如 xyz.cfg。该文件包含以下值:

group address=127.8.8.8
port=7845
Jboss username=xyz_ITR3

我想在需要时通过 shell 脚本更改此内容并保存文件。更改后的内容可能如下所示:

group address=127.8.7.7  
port=7822
Jboss username=xyz_ITR4

我如何通过获取用户输入或其他方式使用 shell 脚本来实现这一点?

【问题讨论】:

  • 您应该针对特定问题提出特定问题。由于 Stack Overflow 向您隐藏了关闭原因:“要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。"

标签: linux bash shell


【解决方案1】:

比如:

#!/bin/bash

addr=$1
port=$2
user=$3

sed -i -e "s/\(address=\).*/\1$1/" \
-e "s/\(port=\).*/\1$2/" \
-e "s/\(username=\).*/\1$3/" xyz.cfg

其中$1,$2$3 是传递给脚本的参数。将其保存为script.sh 之类的文件,并确保它可以使用chmod +x script.sh 执行,然后您可以像这样运行它:

$ ./script.sh 127.8.7.7 7822 xyz_ITR4

$ cat xyz.cfg
group address=127.8.7.7
port=7822
Jboss username=xyz_ITR4

这为您提供了基本结构,但是您需要考虑验证输入等。

【讨论】:

    【解决方案2】:

    *

    #! /bin/sh
    file=xyz.cfg
    addr=$1
    port=$2
    username=$3
    sed -i 's/address=.*/address='$addr'/' $file
    sed -i 's/port=.*/port='$port'/' $file
    sed -i 's/username=.*/username='$username'/' $file
    

    *

    我希望这个对初学者来说更容易理解

    【讨论】:

    • 感谢您,以前从未使用过 sed,也不知道接受的答案中发生了什么
    【解决方案3】:
    sed -i 's/something/other/g' filename.txt 
    

    将就地编辑 filename.txt,并将单词“something”更改为“other”

    我认为 -i 可能是一个 GNU 扩展,但如果它适合你,你可以通过 find、xargs 等添加它。

    如果您想在 shell 脚本中更改它,您可以在命令行中获取参数并按数字引用它们,例如 $1

    编辑:

    根据我的评论,下面 sudo_O 的答案正是您想要的示例。我要补充的是,您通常希望对多个文件、跨越子目录等进行此类匹配,因此了解 find/xargs,您可以将两者结合起来。在一堆 .cfg 文件中更改子网的简单示例可能是:

    find -name '*.cfg' -print0 | xargs -0 -I {} sed -ie 's/\(192.168\)\.1/\1\.7/' {}
    

    注意 find/xargs 的 -print0/-0 参数(对于带有空格的路径/文件名非常有用),并且由于 shell,您必须转义捕获括号(在 sudo 的示例中相同)

    【讨论】:

    • >与其他行一起,我还有几行将在新文件中保持不变。那么如何将这些新内容与旧内容放在一起呢?
    • 我正要按照 sudo_O 的思路添加一个示例,但他的回答是成功;匹配/捕获您关心的“键”,而其他的保持不变
    【解决方案4】:

    除了上述解决方案外,您还应注意替换文本中的转义字符。

    例如,如果您替换 /home/user/ 之类的内容,那么您将无法获得想要的结果。

    要解决此问题,您可以将分隔符从 / 更改为 |。请参阅下面的代码示例。

    OLD="path/to/replace"
    NEW="new/path"
    file=file-to-search.log
    
    sed "s|$OLD|$NEW|g" $file
    

    【讨论】:

      【解决方案5】:
      sed -i "s/$name/$new_name/g" address.txt
      

      此命令也可用于修改数据。

      【讨论】:

        【解决方案6】:

        您可以按如下方式实现 -

        文件 script.sh

        while [ $# -gt 0 ]
        do
         case "$1" in
             --group-address)
                    export NEW_VAL1=$2
                    shift 2
                    ;;
             --port)
                    export NEW_VAL2=$2
                    shift 2
                    ;;
             --username)
                    export NEW_VAL3=$2
                    shift 2
                    ;;
        
            *)
            echo "Unrecognized option: $1"
            usage 1
            esac
        done
        
        
        sed -i 's/group address=.*/group address='$NEW_VAL1'/g' xyz.cfg
        sed -i 's/port=.*/port=.'$NEW_VAL2'/g' xyz.cfg
        sed -i 's/Jboss username=.*/Jboss username='$NEW_VAL3'/g' xyz.cfg
        

        您现在可以通过传递相应的参数来更新这些值 -

        • --组地址
        • --端口
        • --用户名

        在这个脚本的命令行上

        例如-

        ./script.sh --group-address 127.8.7.7 --port  7822 --username xyz_ITR4
        

        【讨论】:

          猜你喜欢
          • 2020-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-04
          相关资源
          最近更新 更多