我使用以下字符串来解析每行文件以创建新字符串
#!/bin/bash
HierTreeFile=$1
while read line; do
strFound=`echo $line | grep "Var:"`
if [ $? -eq 0 ];then
signalName=`echo $line | awk '{print $2}'`
suffix=`echo $line | awk '{print $3}'`
i=3
# echo "before " $i $suffix
while [ $suffix != "l:-1" ];do
# echo "${suffix:0:1}"
i=$((i+1))
# echo "before " $i $suffix
signalName=$signalName$suffix
suffix=`echo $line | awk -v i="$i" '{print $i}'`
# echo "after " $i $suffix
done
echo $signalName
fi
done < $HierTreeFile
传递给上述脚本的文件如下:
Var: Vidhu** [7] l:-1
Var: Vidhu** [6] l:-1
Var: Vidhu** [5] l:-1
Var: Vidhu** [4] l:-1
Var: Vidhu** [3] l:-1
Var: Vidhu** [2] l:-1
Var: Vidhu** [1] l:-1
Var: Vidhu** {1} l:-1
Var: Vidhu** [0] l:-1
我得到以下输出:
Vidhu**[7]
Vidhu**[6]
Vidhu**[5]
Vidhu**[4]
Vidhu**[3]
Vidhu**[2]
Vidhu**1
Vidhu**{1}
Vidhu**[0]
为什么我使用此脚本获得此意外输出( Vidhu 1 **)?
答案 0 :(得分:1)
只需使用bash
的正则表达式功能,而不是多次调用外部程序。
regex='Var: [^ ]* ([^ ]+) l:-1'
while IFS= read -r line; do
if [[ $line =~ $regex ]]; then
signalName=${BASH_REMATCH[1]}
echo "$signalName"
fi
done
输出:
[7]
[6]
[5]
[4]
[3]
[2]
[1]
{1}
[0]
答案 1 :(得分:1)
这是一个应该有效的(GNU&amp; BSD?)sed
实现:
sed -nE 's/^Var: (.*) .*/<\1>/;s/ //gp' inputFile
这只会在以Var:
开头的行上打印,用每个字段替换它们,但第一个和最后一个字段连接起来没有空格。
它依赖于扩展正则表达式,可以在BSD和具有sed
标志的较新GNU -E
上激活,在较早的GNU sed
上激活-r
标志。
$ echo "Var: Vidhu** [7] l:-1
Var: Vidhu** [6] l:-1
Var: Vidhu** [5] l:-1
Var: Vidhu** [1] l:-1
Var: Vidhu** {1} l:-1
Var: Vidhu** [0] l:-1" | sed -nr 's/^Var: (.*) .*/\1/;s/ //gp'
Vidhu**[7]
Vidhu**[6]
Vidhu**[5]
Vidhu**[1]
Vidhu**{1}
Vidhu**[0]