2014-06-16 39 views
3

我無法使用sed替換值並寫入新文件。它寫入新文件,但未能更改任何值。這裏是我的代碼:sed不寫入文件

cd/mydirectory 

echo "Enter file name:" 
read file_input 

file1= "$file_input" 
file1= "$file1.b" 

file2= "$file_input" 
file2= "${file2}Ins.b" 

sed "/\!cats!/s/\!cats!.*/cats!300!/g $file1>$file2 

我只是想替換任何文本是與價值300只貓後,每當我運行此腳本,它不會覆蓋與300有什麼建議以前的值?

+0

你有那些''在你的文件!?另外,你應該在你的'sed'行加上''file1'''和''$ file2'''用雙引號。不知道它會解決你的問題,但至少它應該防止如果文件名包含空格的腳本形式中斷。 (說到雙引號,在'sed「/ .../s/.../... /'表達式末尾缺少一個。) – Qeole

+0

並且在你的'='符號後面的空格中刪除'file1/2 =」...「 '線。 – Qeole

+0

@毛兒感謝您的幫助。 – OldMopMan

回答

0

嘗試改變

sed "/\!cats!/s/\!cats!.*/cats!300!/g $file1>$file2 

sed "s/cats.*/cats300/g" $file1 > $file2 

要替換文本,你經常使用的sed像sed "s/foo/bar/g" file_in > file_out,改變foo所有出現的barfile_in,將輸出重定向到file_out


編輯

我注意到,您將輸出重定向到同一個文件 - 你不能這樣做 。您有2個選項:

  • 將結果重定向到具有不同文件名的另一個文件。例如: -

    sed "s/cats.*/cats300/g" $file1 > $file2.tmp 
    

    注意.tmp$file2

  • 使用-i標誌(如果使用GNU SED):

    sed -i "s/cats.*/cats300/g" $file1 
    

    i代表在線更換

+0

感謝您的幫助。不幸的是,建議的更改無效。我覺得這兩種方法應該是正確的,但唉,我似乎無法讓他們工作,再次感謝。 – OldMopMan

+0

@OldMopMan我相信問題是輸出文件,然後...您使用的是與輸入文件相同的文件名刪除重複的文件名定義,然後再次使用上面的示例嘗試使用,我希望這有助於解決問題 –

+0

謝謝,更改文件名工作,但他們爲什麼是相同的輸出文件?你說我將輸出指向同一個文件,但是$ file1和$ file2不應該是相同的,$ file1應該是$ {file1} .b和$ file2應該是$ {file2} Ins.b。不應該是Ins使它成爲不同的文件名? – OldMopMan

0

我覺得你的腳本的這個修改後的版本應該工作:

echo "Enter file name:" 
read file_input 

file1="$file_input"  # No space after '=' 
file1="$file1.b"  # No space after '=' 

file2="$file_input"  # No space after '=' 
file2="${file2}Ins.b" # No space after '=' 

sed 's/!cats!.*/!cats!300!/g' "$file1" > "$file2" 

注意周圍sed表達單引號:和他們在一起,就沒有必要在你的表達逃離!秒。還請注意圍繞"$file1""$file2"的雙引號:如果其中一個變量包含空格,這將阻止您的命令中斷。

一些進一步的說明:

  • 正如指出的吉姆,你可能需要使用GNU sed的-i選項。
  • 你的正則表達式現在將替換的一切!cats!匹配的行。如果您的線路上出現了幾次!cats!,則只剩下一個。相反,如果你只是想替代兩個!分隔符之間的值,你可以考慮使用以下sed命令:

    sed 's/!cats![^!]*/!cats!300/g'