2013-03-29 23 views
0

我試圖更新Bourne Shell中的文件。用戶輸入一個名稱,然後提示更改人員姓名,年齡和課程。下面是我寫的代碼的一部分:使用Sed來更新Bourne Shell中的文本

echo "please enter the name: \c" 
    read updateInput 

    updateNumber=$(grep -cwi "$updateInput" database.txt) 
    updateRecord=$(grep -i "$updateInput" database.txt) 

    test=$(! grep -i "$updateInput" database.txt) 

    if [ "$updateNumber" -gt "1" ] 
    then 
      echo "ambiguous input" 
    elif [ "$updateRecord" = "" ] 
    then 
      echo "record not found" 
    else 
      lineNumber=$(grep -ni $updateInput database.txt | cut -f1 -d:) 

      grep -i $updateInput database.txt > tmp 
      read first last age course1 course2 < tmp 

      echo "record found, enter new value now:" 
      echo "name ($first $last): \c" 
      read uFirst uLast 
      if [ "$uFirst" != "" ] 
      then 
        sed "$lineNumber s/$first/$uFirst/" database.txt 
      fi 
      if [ "$uLast" != "" ] 
      then 
        sed "$lineNumber s/$last/$uLast/g" database.txt 
      fi 

運行時,sed的輸出與改變了正確的事正確的輸出,但它實際上並沒有在所有的更新數據庫文件。我嘗試了谷歌搜索各種各樣的東西,但沒有任何工作。如果有人能指引我正確的方向,那將是非常棒的。非常感謝:)

回答

2

如果這是GNU sed,則可以使用-i選項來編輯文件地點:

sed -i "$lineNumber s/$first/$uFirst/" database.txt 

否則,您需要將sed的輸出捕捉到一個臨時文件,然後將其複製到原始文件中。

+0

是的,在代碼中缺少'-i' – danza

+0

當我使用-i時出現此錯誤:「sed:1:」database.txt「:d命令末尾的多餘字符」@danza – Josephine

+0

DON' T在實際的文本文件上做實驗! :)我認爲它將'database.txt'作爲命令。在另一個文件上通過命令行對sed進行一些實驗,然後返回到腳本 – danza