1

我有一个 shell 脚本,需要你的专业知识。

 SearchAirline() {
echo "Enter Airline Name:"
read airlineName

if [ $? -eq 0 ];then
echo -e "\t\t\E[43;31;1mFlight Information\E[0m"
echo -e "Departure Time     Flight      Airlines    Vacancy"
echo "__________________________________________________________________________"

#cat flightlist.txt | grep $airlineName flightlist.txt
    old_IFS=$IFS 
    IFS=$'\n'
for LINE in `sed -e '$airlineName'  flightlist.txt`
    do
        print_flight $LINE
    done
  IFS=$old_IFS 
fi

}

给我过滤列表是行不通的。相反,它会打印整个列表。

4

3 回答 3

2
  • 将“$airlineName”更改为“$airlineName”。变量出现在单引号中时不会被插值。
  • 将 sed 表达式更改为仅打印匹配的行:

    sed -n "/$airlineName/p"

编辑:其他答案建议使用其他工具,例如grep,他们可能是对的。我的回答与 sed 有关的唯一原因是您的问题特别要求它。我假设您希望使用 sed 进行比您在问题中描述的更重要的处理。

于 2012-11-22T16:36:01.113 回答
0

As @D.Shawley pointed out, this is REALLY a job for awk but that would mean rewriting the print_flight function too so here's a fixed shell script given some assumptions about your input file:

SearchAirline() {
   echo "Enter Airline Name:"
   read airlineName

   if [ $? -eq 0 ];then
      echo -e "\t\t\E[43;31;1mFlight Information\E[0m"
      echo -e "Departure Time     Flight      Airlines    Vacancy"
      echo "__________________________________________________________________________"

      grep "$airlineName" flightlist.txt |
      while IFS= read -r line
      do
         print_flight "$line"
      done
   fi
}

I strongly recommend you rewrite your script in awk though. If you'd like help with that, post another question and show us what print_flight looks like.

于 2012-11-22T17:23:34.430 回答
0

-n选项添加到您的 sed 调用中:

-n

抑制默认输出(其中每一行,在检查编辑后,被写入标准输出)。仅写入明确选择用于输出的行。

编辑:您还必须使用正确的引号$airlineName。单引号禁用变量替换。我将这一点归功于Martin Ellis,因为我第一次没有注意到它。

顺便说一句 - 我强烈建议使用awk这种报告。它可以处理格式和选择,如果你有一个大数据集,它会快很多。

于 2012-11-22T16:34:14.200 回答