2012-11-22 120 views
1

我有一個shell腳本,需要您在此方面的專業知識。如何使用sed格式化輸出

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 

} 

它不起作用給我過濾列表。相反,它會打印整個列表。

回答

0

添加-n option到您的sed調用:

-n

禁止默認的輸出(在每一行中,檢查編輯後,被寫入到標準輸出)。只有顯式選擇輸出的行被寫入。

編輯:您也可以使用各地$airlineName正確的報價。單引號禁用變量替換。我記得Martin Ellis,因爲我沒有第一次注意到它。

順便說一句 - 我強烈建議使用awk這種報告。它可以處理格式和選擇,如果你有一個大的數據集,它會更快。

2
  • 將'$ airlineName'更改爲「$ airlineName」。變量在單引號中出現時不會插值。
  • 更改sed的表達式匹配,只有打印線:

    sed -n "/$airlineName/p"

編輯:其他答案建議使用其他工具,如的grep,他們可能是正確的。我的回答與sed有關的唯一原因是您的問題具體要求。我假設你期望用sed做比你在問題中描述的更重要的處理。

0

正如@ D.Shawley指出,這實在是awk的工作,但那就意味着重寫print_flight功能也因此這裏是給你的輸入文件的一些假設一個固定的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 "__________________________________________________________________________" 

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

我強烈建議您在awk中重寫您的腳本。如果您想獲得幫助,請發佈另一個問題並向我們展示print_flight的外觀。