ファイル名Staff.txtとサンプルコンテンツは次のとおりです。
JHON
MANAGER
10000
JHON
ファイル内で探したいと思い、その行の後の2行目の内容を別の単語/番号に変更したいと思います。
どうすればいいですか?
答え1
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}
- f
trueの場合、ラインを次に設定し、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 でない場合にのみ印刷します。