単語を見つけて次の2行目の単語のみを置き換える方法

単語を見つけて次の2行目の単語のみを置き換える方法

ファイル名Staff.txtとサンプルコンテンツは次のとおりです。

JHON
MANAGER
10000

JHONファイル内で探したいと思い、その行の後の2行目の内容を別の単語/番号に変更したいと思います。

どうすればいいですか?

答え1

Edを使ってください!

ed -s staff.txt <<< $'/JHON/+2s/.*/4242\nw\nq'

-sこれはファイルのスクリプトモード()でedを呼び出しstaff.txt、ここで引用されたANSI文字列に次のコマンドを送信します。

  • ()を含む行JHONとその行を超えて2行を探します。+2
  • .*その行で()内のすべての項目を検索して置き換えます。4242
  • wディスクへのファイルの書き込み
  • qそれによって編集されました

真ん中にあるのは\n他のedコマンドを区別します。

または、次のようにc行を変更できます。

ed -s staff.txt <<< $'/JHON/+2c\n4242\n.\nw\nq'

ここで、代替テキストはcピリオド(\.\n)で終わる(コマンドの後に)別々に入力する必要があります。

答え2

sed以下を使用して次の行に移動できますn

sed '/JHON/{n;n;s/.*/42/}'

答え3

使用awk:

awk 'f{$0="newvalue";f=0}/JHON/{print;getline;f=1}1'

f{$0="newvalue";f=0}- ftrueの場合、ラインを次に設定し、newvalue次にfリセットします。0

/JHON/{print;getline;f=1}-JHONパターンが見つかったら印刷し、次の行を印刷してf次に設定します。1

1- 印刷

答え4

1人(登録者1人)しかいない場合は、次のコードを使用できます。

awk '/JHON/{print $0; getline; print "SUPERVISOR"; getline; print "99999"; }' staff.txt

staff.txtファイルに人が多い(レジスタも多い)JHONデータのみを変更する必要がある場合:

awk '/.*/{if($0=="JHON"){print $0; getline; print "SUPERVISOR"; getline; print "99999"; } else {print $0;}}' staff2.txt

staff2.txt:

JHON
MANAGER
10000
ROGER
TEACHER
3000
ROBERT
SCIENTIST
20000

次の結果を出力する必要があります。

JHON
SUPERVISOR
99999
ROGER
TEACHER
3000
ROBERT
SCIENTIST
20000

同じ出力を得るもう一つの簡単な方法は次のとおりです。

awk '/JHON/{print;getline; print "SUPERVISOR"; getline; $0="99999"}1' staff2.txt

説明:行がJHONの場合は、JHONを印刷して次の行に移動してSUPERVISORを印刷し、次の行に移動して99999に置き換えます。行が JHON でない場合にのみ印刷します。

関連情報