2016-03-20 57 views
0

我在MINIX上寫了一個BASH shell腳本,我想用一個字符串替換整個文件的特定行號,並且這個替換爲overwriten to原始文件。未印在stdout上。sed:用數字替換整行覆蓋原文件

行和替換字符串的數字是具有下列名稱的腳本變量:

line (e.g. 8) 
repstring (e.g. "134|Wan|Cho|1988-03-20") 

於是我米嘗試下面的代碼:

sed -i "${line}s/.*/${repstring}/" $filename 

但是,當我嘗試執行腳本我得到的消息:

sed: unknown option -- i 
usage: sed [-aEnr] script [file ...] 
     sed [-aEnr] [-e script] ... [-f script_file] ... [file ...] 

是否有可能使此文件editi以另一種方式?

p.s.我知道將sed的輸出重定向到一個新文件,然後將新文件移動到原始文件,但我不想在此過程中創建任何其他文件。

+0

看來你的-i參數是無效的。看着sed的手冊頁。 -i參數需要一個擴展名,在這種情況下你沒有添加一個擴展名。 –

+0

我剛剛在這裏閱讀:http://www.grymoire.com/Unix/Sed.html#uh-62h 但我alreade嘗試'pkgin update'和'pkgin install sed',但它說數據庫已經啓動-至今。那麼手動安裝該擴展的正確方法是什麼? –

+0

@ClaudioCorsi'-i'選項不需要擴展就可以進行就地編輯,但添加擴展名(例如'-i.bak')將創建原始文件的備份,現在有一個' .bak'擴展名。 – assefamaru

回答

1

根據the documentation,MINIX使用sed的極小版本。如果您想堅持sed,只需使用重定向,然後移動輸出文件以替換舊的。

sed "${line}s/.*/${repstring}/" "$filename" > /tmp/sed.tmp && mv /tmp/sed.tmp "$filename" 

或者,使用的Perl:

perl -pi -e "if (\$.==$line) {s/.*/$repstring/ && end}" "$filename" 

變量$.表示當前行號。

+0

那麼這個解決方案工作正常。但是,是否可以更新MINIX使用的'sed'版本來執行此編輯,而無需在此過程中創建任何臨時文件? –

+0

您可能會下載並編譯GNU版本,或者只是使用Perl。看幾秒鐘前我最近的編輯。 – miken32

+0

值得檢查,看看它是否已經安裝爲'gsed'雖然... – miken32

1

首先確定在${repstring}中找不到什麼字符。當/是字符串的一部分時,您想使用其他一些獨特的字符。

你可以試試舊編輯器ed

ed -s "${filename}" << EOF 
${linenr}s/.*/${repstring}/g 
w 
q 
EOF 

當你不知道什麼是獨特的性格,你可以使用

ed -s "${filename}"<< EOF 
${linenr}c 
${repstring} 
. 
w 
q 
EOF 

但你真的應該在repstring控制。 猜猜看下一個repstring會發生什麼:

repstring=". 
!touch WarnedYou"