Bash循环 - 在行而不是单词上进行标记

时间:2009-10-29 22:40:24

标签: bash scripting sed token

我正在编写一个脚本来将变量替换到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

我的脚本将用“test environment variable one”替换文件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脚本。

1 个答案:

答案 0 :(得分:5)

sed '/^ *#/d;s/#.*//' source.env | while read LINE; do
  echo "$LINE"
done

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