【问题标题】:How to replace same word from config file to different words from array如何将配置文件中的相同单词替换为数组中的不同单词
【发布时间】:2019-11-15 11:33:31
【问题描述】:

你好。

我是 Shell 脚本的新手,所以需要您的帮助...

我有以下信息的配置文件

配置名称 AAAA 根根 端口号 00000 主机名哈哈哈 配置名称 AAAA 少根 端口号 00001 主机名 nonononono 配置名称 AAAA 少根 端口号 00002 主机名 nonononono

在我的 bash 文件中,有一个带有以下信息的数组列表

${array1[0]} # Has value of value11111
${array2[1]} # Has value of value22222
${array2[1]} # Has value of value33333

我想更改配置文件并保存如下

配置名称 value11111 根根 端口号 00000 主机名哈哈哈 配置名称 value22222 少根 端口号 00001 主机名 nonononono 配置名称 value33333 少根 端口号 00002 主机名 nonononono

我尝试了 awk 和 sed,但没有成功.....你能帮忙吗?

【问题讨论】:

  • shell 数组是如何被填充的?您可能不需要它们,而是可以直接从它们所填充的任何内容中获取输入,因此盲目地在它们之上构建并不是一个好主意。
  • 如果值始终为value11111value22222 等。您可以使用awk 生成替换。如果它们是任意值,那么您将需要使用脚本和参数扩展。可以使用awksed,但在这种情况下,您将为每个替换生成一个附加进程。为@EdMorton 的评论提供答案

标签: bash shell awk sed


【解决方案1】:

查看一些 of these 的答案。

我赞同 Ed 和 David 的建议(事后看来,整篇文章可能是评论而不是答案),awk/sed 可能不是完成这项工作的最佳工具,您可能希望退后一步,重新思考这个过程。有很多事情可能会出错;数组值可能没有正确填充,没有检查所有替换是否存在足够的值,最后,您无法回滚更改。

不过,这里是一个起点,只是为了说明一些 sed。它当然不是性能最高的,只适用于 GNU sed,但提供了你需要的输出

#!/bin/bash

declare -a array
array=(value11111 value22222 value33333)

for a in "${array[@]}"; do
    # Use sed inline, perform substitutions directly on the file
    # Starting from the first line, search for the first match of `config name AAAAA`
    #   and then execute the substitution in curly brackets
    sed -i "0,/config name AAAAA/{s/config name AAAAA/config name $a/}" yourinputconfigfile
done
# yourinputconfigfile

    config name value11111
    root root
    port number 00000
    Hostname hahahahah

    config name value22222
    root less
    port number 00001
    Hostname nonononono

    config name value33333
    root less
    port number 00002
    Hostname nonononono

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2014-06-03
    • 2016-07-11
    • 2014-01-18
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    相关资源
    最近更新 更多