2013-03-28 84 views
2

我試圖從文件中刪除特定的行,然後將編輯後的行追加到文件中。我得到的最後一部分是正確的,但我的sed命令刪除舊的行不起作用。爲什麼不能sed從文件中刪除行?

sed '/^$userinput/d' file1.txt > file2.txt 

這最終將所有的文件內容到新文件。而不僅僅是我想要保留的線條。用戶輸入是我想要刪除的行,由用戶給出。這是我正在爲班級工作的BASH項目。我想通過刪除它從文件中刪除該行。

sed "/^${1}$/d" file > otherfile 

這增加了所有行想要和不想要

sed "/^$1/d" file > otherfile 

創建空文件

繼承人是我與幹活的聲明。最後讓它粘貼進去。

update(){ 
read -p "Enter the course number of the course you would like to update: " updateInput 
grep $updateInput my_course.txt>update.txt 
    typeset -i status 
    typeset grade 
    if [ $? -eq 0 ] 
    then 
     read -p "Status: " status 
     while(true) 
      do 
       if [ $status -eq 0 ] 
       then 
        break 
       elif [ $status -eq 1 ] 
       then 
        break 
       else 
        printf "Enter either a 0 or 1\n" 
       fi 
      done 
     read -p "Grade: " grade 
     while(true) 
      do 
       if [ $status -eq 0 ] 
       then 
        break 
       elif [ $status -eq 1 ] 
       then 
        break 
       else 
        printf "Enter either a 0 or 1\n" 
       fi 
      done 
     read -p "Grade: " grade 
     while(true) 
      do 
      case $grade in 
        A) 
        break 
        ;; 
        B) 
        break 
        ;; 
        C) 
        break 
        ;; 
       *) 
        read -p "Enter either an A, B, C: " grade 
       ;; 
       esac 
      done 
      sed "/^$updateinput/d" my_course.txt>my_course1.txt 
      awk -F, ' 
      /^CSC/{printf$1","$2","$3"," > "update1.txt"}' update.txt 
      printf $status","$grade >> update1.txt 
      cat my_course1.txt > my_course.txt 
      cat update1.txt >> my_course.txt 
      rm update.txt 
      rm update1.txt 
    fi 
    } 

我很抱歉沒有更快發佈它。有時候我試着粘貼它,告訴我有錯誤。

放置兩行文本文件中,並調用上述腳本其狀態爲1和後級爲A,這是TE輸出

CSC3320,系統級編程,3,1,A

這基本上是改變文件的腳本。在函數的開頭增加一個grep。

 grep $updateInput my_course.txt>update.txt (This is at the beginning of the function. Everything else was at the bottom.) 


     sed "/^$updateinput/d" my_course.txt>my_course1.txt 
     awk -F, ' 
     /^CSC/{printf$1","$2","$3"," > "update1.txt"}' update.txt 
     printf $status","$grade >> update1.txt 
     cat my_course1.txt > my_course.txt 
     cat update1.txt >> my_course.txt 
     rm update.txt 
     rm update1.txt 
+0

請發佈一個重現問題的腳本的最小示例。 – Sebastian 2013-03-28 03:15:40

回答

1

在這種情況下,您需要這樣做,因爲$意味着行尾正則表達式。

嘗試:

sed "/^${userinput}/d" file1.txt >> file2.txt 

而且>>將追加到該文件。

+0

我不想用一個變量替換我想完全刪除該行。 $ userinput是用戶想要刪除的行。 – thad 2013-03-28 02:34:29

+0

噢,好吧,如果你從用戶那裏讀取這行代碼,那麼這與變量存儲在變量中的變量是一樣的嗎? – squiguy 2013-03-28 02:35:57

+0

是從用戶讀入的行是放入$ userinput的內容,然後用於在文件中搜索要刪除的行 – thad 2013-03-28 02:42:40

0

$是sed意思是「行尾」的特殊字符。如果你想字面$userinput在行乞討匹配使用see '/^\$userinput/d'

如果你想你的shell來替代變量$userinput其內容,請使用雙引號來代替單引號:

sed "/^$userinput/d" file1.txt > file2.txt 

或更好的是

sed "/^${userinput}/d" file1.txt > file2.txt 

,如果你只想刪除是完全的${userinput}值線,將刪除開頭的${userinput}值線,使用

sed "/^${userinput}$/d" file1.txt > file2.txt 

作品對我來說:

╰─ ☭ cat file 
bar 
foobar 
foo 
asdf 
qwer 
foo 
asdf 
╰─ ☭ cat script.sh 
#!/bin/bash 
sed "/^${1}$/d" file > otherfile 
╰─ ☭ ./script.sh foo 
╰─ ☭ cat otherfile 
bar 
foobar 
asdf 
qwer 
asdf 
+0

這也行不通。由於一些奇怪的原因,它將在命令行上工作,但不在bash腳本文件中。 – thad 2013-03-28 02:37:31

+0

那也沒用。它不會刪除一行,也不會像添加所有行之前所做的那樣,而是將所需行和不需要的內容都打印出來。 – thad 2013-03-28 02:41:27

0

我做了嘗試,發現變量值wasnt妥善由sed的語句殼更換。 所以sed命令而不是搜索值的模式在做變量名稱爲模式的搜索

即有人試圖尋找$ userinput爲模式@ EOL

這是由於存在單引號,再次嘗試你的命令,但用雙引號替換它們:它工作在我的系統。

代碼::

[email protected] ~> cat new 

#!/bin/bash 

echo "the input file :" 
cat INPUT2.txt ; 

echo "enter line to remove" ; 
read rem ; 

date >> sed.log ; 

sed "/$rem/d" INPUT2.txt >> sed.log; 

echo "the output file :" ; 
cat sed.log; 

運行::

[email protected] ~ > ./new 

the input file : 
aa1 
chap1 
mk.t 
temp.txt 
z1 
z2 

enter line to remove 
temp.txt 

the output file : 
Thu Mar 28 08:18:07 IST 2013 
aa1 
chap1 
mk.t 
z1 
z2 
+0

只是將空文本添加到文件 – thad 2013-03-28 03:00:47

+0

其可能sed沒有工作,它發生過一次 - 您可以在腳本中添加set -xv並檢查變量值是否在shell執行sed語句之前被替換 您應該看到一些東西像這樣:: sed命令 'sed「/ $ rem/d」INPUT2.txt >> sed.log;'將被擴展爲::: '++ sed /temp.txt/d INPUT2.txt'只是在執行之前 – nsd 2013-03-28 05:26:42

0

想出如何解決它。

update(){ 
read -p "Enter the course number of the course you would like to update: " updateInput 
grep -v ^$updateInput my_course.txt>updatedfile.txt 
grep ^$updateInput my_course.txt>editedline.txt 
if [ $? -eq 0 ] 
    then 
    while(true) 
     do 
      read -p "Status: " status 
      if [ $status -eq 0 ] 
      then 
       break 
      elif [ $status -eq 1 ] 
      then 
       break 
      else 
       printf "Enter either a 0 or 1\n" 
      fi 
     done 
    read -p "Grade: " grade 
    while(true) 
     do 
     case $grade in 
       A) 
       break 
       B) 
       break 
       ;; 
       C) 
       break 
       ;; 
       *) 
       read -p "Enter either an A, B, C: " grade 
      ;; 
      esac 
     done 
     awk -F, ' 
     /^CSC/{printf$1","$2","$3"," >> "updatedfile.txt"}' editedline.txt 
     printf $status","$grade"\n" >> updatedfile.txt 
     cat updatedfile.txt > my_course.txt 
     rm updatedfile.txt 
     rm editedline.txt 
    else 
    printf "This course doesn't exist in your courses list.\n" 
fi 
} 

在代碼的開始,我用

grep -v regexexperssion file1>file2 

來獲取文件中的所有線路沒有被刪除的人。然後我使用grep從文件中獲取要編輯的實際行。

grep regexexperssion file1>file3 

在在AWK底部我執行使用用戶的編輯生成在file3的行變量,然後我追加一條到文件1,將其與

grep -v regexexpression file1>file2 

命令

產生

注意上面的解釋與上面使用的實際代碼不匹配,因爲我認爲這會更好地爲查看這封信的人提供更一般的解釋。另外我知道可能有更好的方法來解決這個問題,上面的代碼可能會縮短。任何關於如何改善這一點的輸入將不勝感激。感謝所有幫助過我的人。