заменить текстовую строку - PullRequest
1 голос
/ 20 апреля 2010

Я хочу заменить дату, найденную в конце строки «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, которая не закомментирована, а затем заменить / mysqlApr4 на / mysqlApr20

datadir=/mysqlApr20

Если это возможно, я хотел бы прокомментировать более старый путь к датадиру.

#datadir=/mysqlApr5

Я могу вывести текущую дату как:

date '+%b%d'

Но я хочу объединить его со словом "/ mysql" и заменить или прокомментировать текущую строку данных.

Ответы [ 4 ]

4 голосов
/ 20 апреля 2010

Вы можете сделать это с помощью 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
0 голосов
/ 20 апреля 2010

Все одним махом:

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

Это закомментирует незакомментированную строку. Он добавляет новую строку сразу под старой, а не в конец файла, поэтому работает аналогично показанным версиям AWK и Perl.

0 голосов
/ 20 апреля 2010
awk -vd="$(date +%b%d)" '!/#/&&/datadir/{$0="#"$0"\ndatadir=/mysql"d}1' /etc/my.cnf>temp && mv temp file
0 голосов
/ 20 апреля 2010

Однострочный Perl, который редактирует файл на месте:

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