使用 sed,如何替换匹配行中的单词?

使用 sed,如何替换匹配行中的单词?

我正在尝试编写一个 sed 表达式来检测与此类似的行:

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

并替换ttys0something_else

我不想检测注释掉的行(以 开头#

我可以替换整行,但如何只替换子字符串,而使该行的其余部分保持不变?

答案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

这会更改以正则表达式开头的任何行,以适应您的需求。

相关内容