我的文件中包含以下内容:
[Class:ABCD_EFGH_IJK]
list.0=VALUE001*
list.1=VALUE002*
list.2=VALUE003*
list.3=VALUE004*
[Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK]
condition=true
[Class:LMNO_PQRS_TUV]
list.0=VALUE004*
list.1=VALUE005*
list.2=VALUE006*
list.3=VALUE007*
[Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV]
condition=true
我还有另一个脚本,该脚本使用类名和列表值作为参数运行。例如:
./myscript VALUE001* ABCD_EFGH_IJK
我需要使用一个for循环来遍历每个类并获取每个值来运行我的脚本。我该如何实现?
答案 0 :(得分:2)
这是您要的:
$ awk -F'[]:=[]' '/Class:/{class=$3} /^list/{print $2, class}' file |
xargs -n2 echo ./myscript
./myscript VALUE001* ABCD_EFGH_IJK
./myscript VALUE002* ABCD_EFGH_IJK
./myscript VALUE003* ABCD_EFGH_IJK
./myscript VALUE004* ABCD_EFGH_IJK
./myscript VALUE004* LMNO_PQRS_TUV
./myscript VALUE005* LMNO_PQRS_TUV
./myscript VALUE006* LMNO_PQRS_TUV
./myscript VALUE007* LMNO_PQRS_TUV
当您准备好实际调用echo
时,请删除./myscript
。
答案 1 :(得分:0)
尝试一下:
首先,我使用awk
并将配置文件转换为以下格式:
awk '/^\[/ { app=substr($0,2,length-2) } /=/ { print app "." $0 }' test.txt
Class:ABCD_EFGH_IJK.list.0=VALUE001*
Class:ABCD_EFGH_IJK.list.1=VALUE002*
Class:ABCD_EFGH_IJK.list.2=VALUE003*
Class:ABCD_EFGH_IJK.list.3=VALUE004*
Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK.condition=true
Class:LMNO_PQRS_TUV.list.0=VALUE004*
Class:LMNO_PQRS_TUV.list.1=VALUE005*
Class:LMNO_PQRS_TUV.list.2=VALUE006*
Class:LMNO_PQRS_TUV.list.3=VALUE007*
Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV.condition=true
让我们在文件myconfig.txt
上通话
现在您可以在其上编写一个for循环:
for i in `cat myconfig.txt`
do
if [[ ! $i == *"true"* ]]; then
val=`echo $i|cut -d'=' -f2` #outputs VALUE001*
class=`echo $a|cut -d':' -f2|cut -d'.' -f1` # outputs ABCD_EFGH_IJK
./myscript $val $class
fi
done
注意:这可能不是最好的解决方案,但这可以帮助您入门。 让我知道是否有帮助。
答案 2 :(得分:0)
在sed
中使用Hold空间的一个可怕示例(过于复杂)是
sed -nr '/\[Class:/ {s/\[Class:(.*)\]/\1/;h};/list/{G;s#.*=(.*)\n#./myscript \1 #p}' file
换句话说:
当您看到带有Class:
的行时,将类名复制到Hold空间。
当看到带有list
的行时,请将Hold空格(类名)附加到当前行,
并使用插入的换行符修改第一部分。
打印行。
当替换字符串具有#
时使用\
。
在()
中记住的匹配字符串将通过\1
进行调用。