1

我想在两个文件中修改IP:

File1的内容有这一行:

AS400=127.0.0.1

File2的内容有这一行:

AS400=127.0.0.1

下面的 bash 脚本会询问我 AS400 的 IP 地址,此时只修改一个文件:

    #!/bin/bash
    # Modify props file - file1.props
echo " Please answer the following question"    
gawk -F"=" 'BEGIN{
    printf "Enter AS400 IP: "
    getline as400 <"-"
    file="/usr/local/src/file1.props"
    }
    /as400/ {$0="as400="as400}
    {
    print $0 > "temp2"
    }
    END{
    cmd="mv temp2 "file
    system(cmd)
    }
    ' /usr/local/src/file1.props

我如何告诉它更新我在file2中输入的完全相同的 IP 地址?

额外的问题......谁能看看这个脚本并告诉我为什么要编辑的文件在每行末尾都有一个 ^M ?

4

3 回答 3

2

不用包装 awk,而是使用临时文件并调用mvwith system(),您可以将 bash 作为一个整体来使用:

#!/bin/bash

[[ BASH_VERSINFO -ge 4 ]] || {
    echo "You need bash version 4.0 to run this script."
    exit 1
}

read -p "Enter AS400 IP: " IP

FILES=("/usr/local/src/file1.props" "/usr/local/src/file2.props")

for F in "${FILES[@]}"; do
    if [[ -f $F ]]; then
        readarray -t LINES < "$F"
        for I in "${!LINES[@]}"; do
            [[ ${LINES[I]} == 'as400='* ]] && LINES[I]="as400=${IP}"
        done
        printf "%s\n" "${LINES[@]}" > "$F"
    else
        echo "File does not exist: $F"
    fi
done

将其保存到脚本并运行bash script.sh.

您也可以修改它以接受自定义文件列表。替换此行

FILES=("/usr/local/src/file1.props" "/usr/local/src/file2.props")

FILES=("$@")

然后像这样运行脚本:

bash script.sh "/usr/local/src/file1.props" "/usr/local/src/file2.props"
于 2013-09-16T18:24:01.437 回答
0

实际上,如果您取消交互式提示并使用命令行参数,脚本可以变得更简单、更优雅和更实用。

#!/bin/sh
case $# in
    1) ;;
    *) echo Usage: $0 '<ip>' >&2; exit 1;;
esac

for f in file1.props file2.props; do
    sed -i 's/.*as400.*'/"as400=$1"/ /usr/local/src/"$f"
done

如果您sed不支持该-i选项,请回退到原始脚本中的临时文件旋转。

于 2013-09-16T18:20:14.377 回答
0
#!/bin/bash
read -p "Enter AS400 IP: " ip
sed -i '' "s/\(^as400=\)\(.*\)/\1$ip/" file1 file2

至于你的奖金,看看这个:'^M'字符在行尾

于 2013-09-16T18:21:57.957 回答