2016-03-20 13 views
0

私はMINIX上でファイルの特定の行を数字で特定の文字列に置き換えたい場合はに上書きするBASHシェルスクリプトを作成します元のファイルstdoutには印刷されません。sed:元のファイルを上書きして番号全体を置き換えます。

ラインと置換文字列の数は、次の名前のスクリプトの変数です:私がしようとすると、

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

しかし:

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

だから私は、次のコードを試しメートルスクリプトを実行します。メッセージを取得します。

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

このファイルを編集することは可能ですか別の方法で?

p.s. sedの出力を新しいファイルにリダイレクトしてから、新しいファイルを元のファイルに移動していることに気付いていますが、処理中に他のファイルを作成したくありません。

+0

-iパラメータが無効であるようです。 sedのmanページを見てください。 -iパラメータには拡張子が必要です。この場合、追加する必要はありません。 –

+0

私はちょうどここでそれについて読んでいます:http://www.grymoire.com/Unix/Sed.html#uh-62h しかし、私は 'pkgin update'と' pkgin install sed'を試しましたが、データベースがアップしています-現在まで。その拡張機能を手動でインストールする適切な方法は何ですか? –

+0

@ClaudioCorsi '-i'オプションは、インプレース編集を実行するために拡張子を必要としませんが、拡張子(例えば' -i.bak'など)を追加すると元のファイルのバックアップが作成されます。 .bak拡張子。 – assefamaru

答えて

1

the documentationによると、MINIXは非常に最小限のバージョンsedを使用しています。 sedを使用する場合は、リダイレクトを使用してから、出力ファイルを移動して古いファイルを置き換えます。

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

可変$.現在の行番号を表す:

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

または、Perlが使用します。

+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=". 
!touch WarnedYou" 
関連する問題