bash使用包含" [1]"

时间:2017-02-27 10:13:22

标签: bash shell

我使用以下字符串来解析每行文件以创建新字符串

#!/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 **)?

2 个答案:

答案 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]