我正在编写一个小脚本,它从具有特定格式的设置文件中获取一些配置选项(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
我显然无法使用这样的数据,因为最后一个读取条目以某种方式被破坏了。发生了什么,如何阻止这种情况发生?
此致
答案 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