1

私はシェル スクリプトを持っており、これに関する専門知識が必要です。

 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

-nオプションを sed 呼び出しに追加します。

-n

デフォルト出力を抑制します (各行は、編集のために検査された後、標準出力に書き込まれます)。出力用に明示的に選択された行のみが書き込まれます。

編集:また、周りに正しい引用符を使用する必要があります$airlineName。一重引用符は、変数置換を無効にします。最初は気づかなかったので、Martin Ellisのおかげです。

ところで -awkこの種のレポートに使用することを強くお勧めします。書式設定と選択を処理でき、大きなデータ セットがある場合ははるかに高速になります。

于 2012-11-22T16:34:14.200 に答える
0

@D.Shawley が指摘したように、これは本当に awk の仕事ですが、それは print_flight 関数も書き直すことを意味するため、入力ファイルに関するいくつかの仮定を前提とした修正シェルスクリプトを次に示します。

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 に答える