22

我有一个要求,我需要更改文件的内容,比如 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 脚本来实现这一点?

4

6 回答 6

39

怎么样:

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

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

于 2013-02-01T10:04:25.710 回答
19

*

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

*

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

于 2015-02-17T10:27:58.383 回答
9
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 参数(对于带空格的路径/文件名非常有用),并且由于外壳,您必须转义捕获括号(在 sudo 的示例中相同)

于 2013-02-01T09:58:44.053 回答
2

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

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

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

OLD="path/to/replace"
NEW="new/path"
file=file-to-search.log

sed "s|$OLD|$NEW|g" $file
于 2020-07-24T07:22:34.343 回答
1
sed -i "s/$name/$new_name/g" address.txt

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

于 2019-07-04T05:41:40.883 回答
0

您可以按如下方式实现 -

文件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-08-04T11:53:59.077 回答