替换文本字符串

时间:2010-04-20 04:52:26

标签: 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行,然后用/ mysqlApr20替换/ mysqlApr4

datadir=/mysqlApr20

如果可能,我想评论较旧的datadir路径。

#datadir=/mysqlApr5

我可以输出当前日期:

date '+%b%d'

但是我想用“/ mysql”这个词来连接它,并替换或注释当前的datadir线。

4 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:0)

Perl one-liner,可以就地编辑文件:

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

答案 2 :(得分:0)

awk -vd="$(date +%b%d)" '!/#/&&/datadir/{$0="#"$0"\ndatadir=/mysql"d}1' /etc/my.cnf>temp && mv temp file

答案 3 :(得分:0)

一举一动:

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

这将注释掉未注释的行。它在旧文件的下方添加了新行,而不是在文件的末尾添加,因此它的工作方式类似于显示的AWK和Perl版本。