Sed 替换文本字符串

Sed 替换文本字符串,sed,awk,Sed,Awk,我想用当前日期替换“datadir”行末尾的日期。 例如,我的my.cnf文件如下所示 # 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 大多数行都有注释。我需要找到没有注释的datadir行,然后

我想用当前日期替换“datadir”行末尾的日期。 例如,我的my.cnf文件如下所示

# 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
大多数行都有注释。我需要找到没有注释的datadir行,然后用/mysqlApr20替换/mysqlApr4

datadir=/mysqlApr20
如果可能的话,我想对旧的datadir路径进行注释

#datadir=/mysqlApr5
我可以将当前日期输出为:

date '+%b%d'

但我想用“/mysql”这个词来表示它,并替换或注释当前的datadir行。

您可以使用sed和就地替换:

sed -i "s|^datadir=.*$|datadir=/mysql`date '+%b%d'`|" /etc/my.cnf
如果要注释掉旧行并添加新行,可以使用sed进行注释,只需添加新行:

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

您可以使用sed和就地替换来完成此操作:

sed -i "s|^datadir=.*$|datadir=/mysql`date '+%b%d'`|" /etc/my.cnf
如果要注释掉旧行并添加新行,可以使用sed进行注释,只需添加新行:

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

Perl—在位编辑文件的一行程序:

perl -i -nle 'BEGIN { $date = `date +%b%d` }; if (/^datadir=/) { print qq{#$_\ndatadir=/mysql$date} } else {print}' my.cnf

Perl—在位编辑文件的一行程序:

perl -i -nle 'BEGIN { $date = `date +%b%d` }; if (/^datadir=/) { print qq{#$_\ndatadir=/mysql$date} } else {print}' my.cnf
一蹴而就:

sed -i '/^datadir.*/{s.^.#.;s.$.\ndatadir=/mysql'$(date "+%b%d")'.;q}' /etc/my.cnf
这将注释掉未注释的行。它将新行添加到旧行的正下方,而不是文件的末尾,因此它的工作方式与所示的AWK和Perl版本类似。

一下子:

sed -i '/^datadir.*/{s.^.#.;s.$.\ndatadir=/mysql'$(date "+%b%d")'.;q}' /etc/my.cnf
这将注释掉未注释的行。它将新行添加到旧行的正下方,而不是文件的末尾,因此它的工作方式与所示的AWK和Perl版本类似