我正在尝试编写一个 sed 表达式来检测与此类似的行:
s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux
并替换ttys0
为something_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
这会更改以正则表达式开头的任何行,以适应您的需求。