3

Я часто хочу автоматизировать такого рода задачи в сценарии оболочки:

если строка:

SOMEKEY=SOMEVALUE

существует в файле, затем измените его на

SOMEKEY=SOMEOTHERVALUE

в противном случае добавьте строку SOMEKEY=SOMEOTHERVALUE в файл.

Как я мог пойти об этом? Я думаю, что мог бы сделать это, используя комбинацию grep и sed , но я уверен, что это достаточно распространенная задача, что кто-то уже разработал элегантное решение.

Кстати, при замене я бы обычно делал что-то подобное

sed -i 's/old/new/g' fname

Но это означает, что я должен быть очень осторожным при составлении своих регулярных выражений, чтобы не ошибиться. Есть ли простой способ "предварительного просмотра", какие изменения произойдут из моего вызова sed без реального нажатия на файл?

1 ответ1

1

Я бы использовал awk для этой задачи:

   awk -F'=' -v "keyname=$SOMEKEY" -v "value=$SOMEOTHERVALUE" '
            $1 == keyname {
                    if ($2 != value) $2 = "\"" value "\""
                    key_found = 1
            }

            { print $1 "=" $2 }

            END { if (!key_found) print keyname "=\"" value "\"" }
   ' fname

при условии,

 SOMEKEY=key1
 SOMEOTHERVALUE="John Doe is dead!"

и учитывая этот вход:

 key1="John Doe is geat!
 key2="Who's John Wayne?"

Один получает:

 key1="John Doe is dead!"
 key2="Who's John Wayne?"

Или, если строка key1 отсутствует, key1="John Doe is dead!" будет добавлен в конце.

Примечание: В Solaris или других производных UNIX, которые все еще поставляют старую версию awk(1), вместо этого следует использовать nawk(1) .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .