web-dev-qa-db-ja.com

特定の行にsedコマンドを使用する

希望の状態が存在するときにファイル内のセルを変更したい。例:

ファイル:

id311    vmName1    state0
id312    vmName2    state0
id313    vmName3    state0

スクリプトを入力すると、このスクリプトは1行の状態列を変更します。したがって、sed -i 's/state0/state1/g'と入力するとすべてのstate0state1になります。次のように1行だけの状態を変更したい:

ファイル:

id311    vmName1    state0
id312    vmName2    state1
id313    vmName3    state0 

Useidを持つ特別な行にsedコマンドを使用するにはどうすればよいですか?注:IDは一意です。

2
Gefolge

sed '<line number>s/<search pattern>/<replacement string>/の前に行番号を追加するだけです。

$ sed '1s/state0/XXXX/' file
id311    vmName1    XXXX
id312    vmName2    state0
id313    vmName3    state0

その場で編集したいので、次のように言います。

sed -i.bak '1s/state0/XXXX/' file

.bakフラグの後に-iを使用していることに注意してください。これにより、file自体の変更が実行されますが、変更前のfileの現在の内容でfile.bakバックアップファイルも作成されます。


変数の行番号の場合、通常は変数を使用し、二重引用符で展開します。

sed -i.bak "${lineNumber}s/state0/XXXX/" file
3
fedorqui

Useidを持つ特別な行にsedコマンドを使用するにはどうすればよいですか?注:IDは一意です。

idsは一意であるため、最初のフィールドをキーとして使用することは理にかなっています。

sed -i '/id312/s/state0/state1/' file

コマンドを作成し、ID番号とファイルをパラメーターとして渡すことができます。

#!/usr/bin/env bash
sed -i "/id$1/s/state0/state1/" $2

このように呼び出す:

./sed.sh 312 file

注:-iスイッチには常に注意してください。最初にそれなしでテストしてください。

2
simlev