複数のファイル(同じディレクトリ)の文字列を条件に置き換えます。

複数のファイル(同じディレクトリ)の文字列を条件に置き換えます。

例:

ファイル1:

Name: abc
Number: 325
Code: 0

ファイル2:

Name: xyz
Number: 578
Code: 0

ファイル3:

Name: ttt
Number: 356
Code: 0

ファイル4:

Name: nnn
Number: 228
Code: 0

ファイル5:

Name: bnb
Number: 434
Code: 0

問題はどう変わるかだ。パスワード到着1提供される数字はい3xxまたは2xx。したがって、File2とFile5は変更されていません。

ファイルには約100行の行がたくさんありますが、これはファイル内の1つの文字列(x行)を置き換える方法の簡単な例ですが、ファイル内の他の文字列(y行)が一致する場合にのみ当てはまります。

答え1

これを行う必要があります。

sed -i 's/^Code: 0$/Code: 1/' $(grep -l '^Number: [23]' File*)
  • 部品sedが物理的に交換されました
  • このgrep -l ... File*セクションには、名前が「File *」と一致し、行または始まるすべてのNumber: 2ファイルが一覧表示されます。Number: 3
  • $(...)コマンド周辺の構成はgrep次のとおりです。コマンドの置き換えリストされたファイルはgrep次のように供給されます。sed

答え2

GNUツールの使用:

grep -lxZ 'Number: [23]..' ./File* |
  xargs -r0 sed -i 's/^Code: 0$/Code: 1/'

答え3

仮説数字常に前にパスワードパスワードどんな値でも可能で、以下を使用してくださいsed

sed -i '/^Number: [23]/{n;s/^Code: .*$/Code 1/}' File*

内容が一貫している場合、次の行は次のようになります。数字いつもコード0、次のように単純化できます。

sed -i '/^Number: [23]/{n;s/0/1/}' File*

答え4

使用しないでくださいsedソースにリダイレクトするとファイルの内容が破損するため、この操作を実行するときに一時ファイルを作成する必要はありません。代わりに編集する
ファイル名が[a-zA-Z0-9_-]の範囲にあるとします。

% cat scr.ed
1,$s/Code: 0/Code: 1/
w
q
% cat scr.sh
#!/bin/sh
for file in `grep -l '^Number: [23]' File*`
do
    ed -s $file <scr.ed
done

% chmod 755 scr.sh
% ./scr.sh

関連情報