Gnu Sed(Gnu / Linux)はmatch + "anything"を見つけて置き換えます。

Gnu Sed(Gnu / Linux)はmatch + "anything"を見つけて置き換えます。

私はファイルのn番目の一致行で一致する文字列を見つけるためにsedを使用しようとしています。numその行の後にmachと「何でも」という表現を使用しますnum x

サンプルファイル:

START
num 1
num 1
num 1
num n
END
sed ':a;N;$!ba; s/num .*/num x/1' example 

出力:

START
num x

sed ':a;N;$!ba; s/num 1/num x/1' example 

出力:

START
num x
num 1
num 1
num n
END

.*式を使用してそれに続くすべての項目を一致させてnum置き換えようとnum x しましたが、結果はファイルの終わりから外れます。式を行の実際の完全な文字列に置き換えると、目的の.*結果が得られますが、行の文字の後には「何でも」が必要です。

答え1

あなたの正規表現は完全に正確ではありません。

$ sed ':a;N;$!ba; s/\nnum[^\n]*/\nnum x/4' file 

答え2

sed は、1 行で s/old/new を実行するのに最適なツールです。他のタスクにはawkを使用してください。

$ awk -v n=4 '/num/ && ((++c) == n){$0="num x"} {print}' file
START
num 1
num 1
num 1
num x
END

関連情報