web-dev-qa-db-ja.com

VIMまたはEXでbashスクリプトを使用してファイル内の特定の行を置き換えることは可能ですか?

EOEXコンストラクトを使用して、ファイル内の特定の行、たとえば5行目を変更したいのですが、どうすれば目的を達成できますか?目的を達成するために使用するコードスニペットは次のとおりです。

#!/bin/bash
S=0.030
F=0.150
N=30
DIFF=`echo "scale=3; $F - $S" | bc -l`
dw=`echo "scale=3; $DIFF / $N" | bc -l`
is=`echo "scale=3; $S / $dw" | bc -l`
if=`echo "scale=3; $F / $dw" | bc -l`
ex ~/Desktop/Dropbox/MATLAB/FFT.m  <<EOEX
  :5s/for*/for i = $S:$dw:$F/g
  :x
EOEX

いくつかの調査を行ったところ、通常はEOF(ファイルの終わり)がhere scriptsで特定のコマンドの標準入力へのI/Oリダイレクトに使用されることがわかりました(私の場合はex)。また、開始キーワードと終了キーワードが同じである限り、EOFの代わりに任意の単語を使用できることも学びました。私の問題は、行をMatlab内の別のfor loop初期化子に置き換えるという望ましい効果の代わりに、このスクリプトは行を削除せず、5行目の最後に文字列を追加しないことです。参考のために、FFT.mファイルも追加しました。以前の質問の抽象化によりご不便をおかけしましたことをお詫び申し上げます。別のプログラムを使用して目的の効果を達成することもできますが、exまたはvimで達成できない理由について知りたいことに注意してください。 Matlabスクリプトについては、 ここ をクリックしてください。

2
Vesnog

exEOEXコンストラクトを使用してtest_fileというファイルの5行目を「helloworld」に変更するには(これにより、「ヒアドキュメント」を意味していると思います) :

ex test_file << EOEX
5c
hello world
.
wq
EOEX

上記はedでも可能ですが、POSIX edwqコマンドをサポートしていないことに注意してください。代わりに、wqを別々の行に配置します。

sed-iオプションをサポートするバージョン)の使用は少し簡単です。

sed -i '15 c hello world' test_file
6
Graeme