从文件中读取时删除一些特殊符号

时间:2016-06-17 07:19:51

标签: bash

我正在编写一个小脚本,它从具有特定格式的设置文件中获取一些配置选项(option = value或option = value1 value2 ...)。

设置文件:

SomeOption=asdf
IFS=HDMI1 HDMI2 VGA1 DP1
SomeOtherOption=ghjk

脚本:

for VALUE in $(cat settings | grep IFS | sed 's/.*=\(.*\)/\1/'); do
    echo "$VALUE"x
done

现在我得到以下输出:

HDMI1x
HDMI2x
VGA1x
xP1

预期产出:

HDMI1x
HDMI2x
VGA1x
DP1x

我显然无法使用这样的数据,因为最后一个读取条目以某种方式被破坏了。发生了什么,如何阻止这种情况发生?

此致

2 个答案:

答案 0 :(得分:0)

通常你可以像这样使用awk

awk -F'[= ]' '$1=="IFS"{for(i=2;i<=NF;i++)print $i"x"}' settings

-F'[= ]将行分为=或空格。以下awk程序检查第一个字段,变量名称是否等于IFS,然后通过第2列迭代到结尾并打印它们。

但是,在评论中你说该文件使用的是Windows行结尾。在这种情况下,您需要在使用awk之前预处理文件。您可以使用tr删除回车符号:

tr -d '\r' settings | awk -F'[= ]' '$1=="IFS"{for(i=2;i<=NF;i++)print $i"x"}'

答案 1 :(得分:0)

原因很可能是您的设置文件使用了DOS行结尾。

修复后(例如dos2unix),您的循环也可以修改为以下内容,删除两个实用程序调用:

for value in $( sed -n -e 's/^IFS.*=\(.*\)/\1/p' settings ); do
  echo "$value"x
done

或者您可以一次完成所有操作,无需修改设置文件:

tr -d '\r' <settings |
for value in $( sed -n -e 's/^IFS.*=\(.*\)/\1/p' ); do
  echo "$value"x
done