【问题标题】:Bash loop - tokenize on lines rather than words [duplicate]Bash循环 - 在行而不是单词上标记[重复]
【发布时间】:2010-12-11 10:42:29
【问题描述】:

我正在编写一个脚本来将变量替换到 Java 属性文件中,格式为 name=value。我有一个源文件,source.env 像这样:

TEST_ENV_1=test environment variable one
TEST_ENV_2=http://test.environment.com/one
#this is a comment with an equal sign=blah
TEST_ENV_3=/var/log/test/env/2.log

我的脚本会将文件 dest.env 中出现的每个 TEST_ENV_1 替换为“测试环境变量一”,依此类推。

我正在尝试一次处理一行,但由于循环从 sed 或 grep 等命令的输出循环标记空白而不是整行:

$ for i in `sed '/^ *#/d;s/#.*//' source.env`; do
  echo $i
  done
TEST_ENV_1=test
environment
variable
one
TEST_ENV_2=http://test.environment.com/one
TEST_ENV_3=/var/log/test/env/2.log

如何将它们视为线条?我想要做的是在“=”符号上将每一行分开,并根据 source.env 文件使用一堆替换正则表达式制作一个 sed 脚本。

【问题讨论】:

    标签: bash scripting sed token


    【解决方案1】:
    sed '/^ *#/d;s/#.*//' source.env | while read LINE; do
      echo "$LINE"
    done
    

    另一种方法是根据@Jim 的回答更改$IFS。在这种情况下最好避免使用反引号,因为它们会导致一次读取整个文件,而将 sed 的输出通过管道传输到上面的while 将允许逐行处理文件而不读取整个文件记忆。

    【讨论】:

    • 太棒了,这很完美。谢谢!!
    • 确实,这简明扼要地回答了这个问题。
    猜你喜欢
    • 2019-10-28
    • 2015-06-06
    • 2012-02-14
    • 2021-05-09
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多