sedを使用して一致する行の単語を置き換える方法は?

sedを使用して一致する行の単語を置き換える方法は?

次のような行を検出するためにsed式を作成しようとしています。

s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux

そしてttys0に交換something_else

#コメント化された行(で始まる)を検出したくありません。

行全体を変更できますが、残りの行は変更せずに部分文字列のみを変更するにはどうすればよいですか?

答え1

これを行う1つの方法は次のとおりです。

echo 's0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux' | 
    sed -e '/^[^#]/ s/ttyS0/foo/'

答え2

ttyS0の前部とttyS0の後部を一致させ、行が次に始まらないことを確認してください#

sed 's/^[^#]\(.*\)ttyS0\(.*\)/\1something\2/'

結果:

%> echo "s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux" | sed 's/^[^#]\(.*\)ttyS0\(.*\)/\1something\2/'
0:12345:respawn:/sbin/agetty -8 -s 115200 something linux

答え3

常にこれで始まる場合はs[number]colon(GNU sedを使用して)、次のことができます。

sed -r '/^s[0-9]+:/s/ttyS0/something_else/' infile

これにより、必要に応じて正規表現で始まるすべての行が変更されます。

関連情報