2016-01-06 3 views
0

Я использую sed для замены строки в файле конфигурации.sed escape user input string

Пользователь должен ввести строки salt, а затем я заменить эту salt строку в конфигурационном файле:

Sample config file myconfig.conf 

CONFIG_SALT_VALUE=SOME_DUMMY_VALUE 

я использую команду, чтобы заменить фиктивное значение со значением salt, введенного пользователем.

sed -i s/^CONFIG_SALT_VALUE.*/CONFIG_SALT_VALUE=$salt/g" ./myconfig.conf 

Issue: значение $salt может содержать любой символ, поэтому, если $salt содержит / (например, 12d/dfs), то мои выше SED команды перерывы.

Я могу изменить разделитель на !, но теперь, если $salt содержит amgh!fhf, тогда моя команда sed сломается.

Как мне решить эту проблему?

ответ

1

You can use almost any character as sed delimiter. Однако, как вы говорите в своем вопросе, продолжать менять его хрупко.

Может быть полезно использовать awk вместо этого, делая немного разборе строки:

awk 'BEGIN{repl=ARGV[1]; ARGV[1]=""; FS=OFS="="} 
    $1 == "CONFIG_SALT_VALUE" {$2=repl} 
    1' "$salt" file 

Как один лайнер:

awk 'BEGIN{repl=ARGV[1]; ARGV[1]=""; FS=OFS="="} $1 == "CONFIG_SALT_VALUE" {$2=repl}1' "$salt" file 

Это устанавливает = в качестве разделителя полей. Затем он проверяет, когда строка содержит CONFIG_SALT_VALUE в качестве имени параметра. Когда это произойдет, оно заменяет значение на заданное.

Чтобы предотвратить значения в $salt как foo\\bar от интерпретации, как другой парень заметил в моем оригинальный ответ, мы имеем трюк:

awk 'BEGIN{repl=ARGV[1]; ARGV[1]=""} ...' "$var" file 

Это использует ответ в How to use variable including special symbol in awk?, где Эд Мортон говорит, что

Способ передачи переменной оболочки в awk без обратных косых черт интерпретирован как передать ее в список arg вместо заполнения переменной awk за пределами s cript.

, а затем

Вы должны установить ARGV[1]="" после заполнения переменной AWK для избежать переменной оболочки значение также рассматривается как имя файла. В отличие от любого другого способа передачи в переменной, ВСЕ символы, используемые в , переменная таким образом обрабатываются буквально без «специального» значения.

Это не делает в месте редактирования, но вы можете перенаправить в другой файл, а затем заменить оригинал:

awk '...' file > tmp_file && mv tmp_file file 
+1

AWK действительно лучший инструмент для этого +1 к – anubhava

+0

на GNU AWK, это не получается, если 'salt = 'foo \\ bar'' –

+0

@thatotherguy после некоторого исследования я нашел решение для этого! Эд Мортон поставил немного света, как обычно:) – fedorqui