2010-04-20 5 views
1

Je souhaite remplacer la date trouvée à la fin de la ligne "datadir" par la date actuelle. Par exemple. mon fichier my.cnf ressemble à ceci ...remplacer une chaîne de caractères

# head /etc/my.cnf 
[mysqld] 

#mount -t tmpfs -o size=102m tmpfs /mnt 
#datadir=/mnt 
read-only 
datadir=/mysqlApr5 
#datadir=/mysqlApr2 
#datadir=/mysqlMar16 
#datadir=/mysqlFeb25a 

La plupart des lignes sont commentées. Je dois trouver la ligne datadir qui n'est pas commenté puis remplacer le/mysqlApr4 avec/mysqlApr20

datadir=/mysqlApr20 

S'il est possible, je voudrais commenter le chemin plus datadir.

#datadir=/mysqlApr5 

je peux sortie la date actuelle comme:

date '+%b%d' 

Mais je veux concaténer avec le mot «/mysql » et remplacer ou commenter la ligne datadir actuelle.

Répondre

4

Vous pouvez le faire avec sed et un remplacement en place:

sed -i "s|^datadir=.*$|datadir=/mysql`date '+%b%d'`|" /etc/my.cnf 

Si vous voulez faire des commentaires sur l'ancienne ligne et ajouter une nouvelle, vous pouvez utiliser sed pour faire le commentaire et ajoutez juste une nouvelle ligne:

sed -i "s|^datadir=.*$|#\\0|" /etc/my.cnf 
echo "datadir=/mysql`date '+%b%d'`" >> /etc/my.cnf 
0

Perl one-liner qui édite le fichier en place:

perl -i -nle 'BEGIN { $date = `date +%b%d` }; if (/^datadir=/) { print qq{#$_\ndatadir=/mysql$date} } else {print}' my.cnf 
0
awk -vd="$(date +%b%d)" '!/#/&&/datadir/{$0="#"$0"\ndatadir=/mysql"d}1' /etc/my.cnf>temp && mv temp file 
0

Dans un seul coup:

sed -i '/^datadir.*/{s.^.#.;s.$.\ndatadir=/mysql'$(date "+%b%d")'.;q}' /etc/my.cnf 

Cela commentera la ligne décommentée. Il ajoute la nouvelle ligne immédiatement au-dessous de l'ancien au lieu de la fin du fichier afin qu'il fonctionne de la même manière que les versions AWK et Perl affichées.

Questions connexes