J'essaie d'écrire une expression sed pour détecter des lignes similaires à ceci:
s0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux
et remplacez le ttys0
par something_else
Je ne veux pas détecter les lignes commentées (commençant par #
)
Je peux replace la ligne entière, mais comment je viens de replace la sous-string, laissant le rest de la ligne intacte?
Une façon de le faire est la suivante:
echo 's0:12345:respawn:/sbin/agetty -8 -s 115200 ttyS0 linux' | sed -e '/^[^#]/ s/ttyS0/foo/'
Faites correspondre la partie avant ttyS0 et celles après ttyS0, vérifiez également si la ligne ne commence pas par #
:
sed 's/^[^#]\(.*\)ttyS0\(.*\)/\1something\2/'
Résultat:
%> 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
S'il commence toujours par s[number]colon
vous pouvez le faire (avec GNU sed):
sed -r '/^s[0-9]+:/s/ttyS0/something_else/' infile
Ce qui change toute ligne qui commence par l'expression rationnelle, s'adapte à vos besoins.