1

特定の文字列で始まるテキスト ファイル内の行全体を sed を使用して置換する bash スクリプトを作成しようとしていますが、最初の一致に対してのみこの置換を実行したいと考えています。

たとえば、私のテキスト ファイルには次のようなものがあります。

hair=brown
age=25
eyes=blue
age=35
weight=177

そして、age の 2 番目のインスタンスに影響を与えずに、「age」で始まる最初の行を別の数字に単純に置き換えたい場合があります。

hair=brown
age=55
eyes=blue
age=35
weight=177

これまでのところ、私は思いついた

sed -i "0,/^PATTERN/s/^PATTERN/PATTERN=XY/" test.txt

ただし、これは行全体ではなく、文字列「age」自体のみを置き換えます。行全体を変更するためにどこかに「\ c」をスローしようとしましたが、これまでのところ何も機能していません。これをどのように解決できるかについて、誰にもアイデアがありますか? ありがとう。

4

2 に答える 2

2

@ruakhが示唆するように、使用できます

sed -i "0,/^PATTERN/ s/^PATTERN=.*$/PATTERN=XY/" test.txt

同じことを行うためのより短くて繰り返しの少ない方法は次のようになります

sed -i '0,/^\(PATTERN=\).*/s//\1XY/' test.txt

これは、後方参照と、s 式でパターンを指定しないと以前に一致したパターンが使用されるという事実を利用します。

于 2013-03-08T23:32:01.923 に答える
0

0,...-範囲は でのみ機能しGNU sedます。別の方法として、次のようにシェル リダイレクトを使用することもできますsed

{ sed '/^\(PATTERN\).*/!n; s//\1VAL;q'; cat ;} < file

または使用awk

awk '$1=="LABEL" && !n++ {$2="VALUE"}1' FS=\\= OFS=\\= file
于 2013-03-09T12:08:57.017 に答える