2016-06-07 3 views
0

У меня есть файл config.ini в say/tmp location. Со следующим содержанием.Поиск и замена с помощью sed

[[email protected] ~]$ cat /tmp/config.ini 
[site] 
"name"="Site 0" 
[node] 
"name"="Node 0" 
[systemsecurity] 
[systemsecurity\webserver] 
"level"="high" 
[tacacs] 
"interface"="0" 
"enable"=dword:00000000 
"port"=dword:00000031 
"allowPersistentTCPConnections"=dword:00000001 
[misc] 
"adminsyspassword"="$ADMIN_PASSWD" 
"adminuser"="admin" 
[[email protected] ~]$ 

И мне нужно заменить «adminsyspassword» на значение, присутствующее в файле/etc/shadow file. И я использовал приведенный ниже сценарий оболочки с командой awk, чтобы получить новое значение для ключа «adminsyspassword» ini-файла.

[[email protected] ~]$ cat /tmp/a.sh 
#! /bin/sh 

echo "Fetching the admin encrypted Password from the /etc/shadow file" 
ADMIN_PASSWD=`sudo awk -F: '/admin/ { print $2}' /etc/shadow` 

PARAM_TO_CHANGE='^\(\"adminsyspassword\"\=\)' 
ANYTHING='.*' 
SEARCH_PATTERN=${PARAM_TO_CHANGE}${ANYTHING} 
REPLACE_PATTERN="\"${ADMIN_PASSWD}\"" 
sed 's|$SEARCH_PATTERN|\\1\\$REPLACE_PATTERN|' /tmp/config.ini 
[[email protected] ~]$ 

Предположим, что значение, полученное с помощью команды awk, хранится в переменной ADMIN_PASSWD. И значение $ ADMIN_PASSWORD фиксируется при запуске сценария оболочки в формате отладки.

[[email protected] ~]$ bash -x /tmp/a.sh 
+ echo 'Fetching the admin encrypted Password from the /etc/shadow file' 
Fetching the admin encrypted Password from the /etc/shadow file 
++ sudo awk -F: '/admin/ { print $2}' /etc/shadow 
+ ADMIN_PASSWD='$6$2qeizEuc$082jxqqkpJJPQuUbJD/aO2zA5SSmibjSY7cEDpNxj9eQhKxhO2NT40O9FmQEe1TbN0KWTNbt.9EZxMQXZNo1A0' 
+ PARAM_TO_CHANGE='^\(\"adminsyspassword\"\=\)' 
+ ANYTHING='.*' 
+ SEARCH_PATTERN='^\(\"adminsyspassword\"\=\).*' 
+ REPLACE_PATTERN='"$6$2qeizEuc$082jxqqkpJJPQuUbJD/aO2zA5SSmibjSY7cEDpNxj9eQhKxhO2NT40O9FmQEe1TbN0KWTNbt.9EZxMQXZNo1A0"' 
+ echo 'sed '\''s|^\(\"adminsyspassword\"\=\).*|\1\"$6$2qeizEuc$082jxqqkpJJPQuUbJD/aO2zA5SSmibjSY7cEDpNxj9eQhKxhO2NT40O9FmQEe1TbN0KWTNbt.9EZxMQXZNo1A0"|'\'' /tmp/config.ini' 
sed 's|^\(\"adminsyspassword\"\=\).*|\1\"$6$2qeizEuc$082jxqqkpJJPQuUbJD/aO2zA5SSmibjSY7cEDpNxj9eQhKxhO2NT40O9FmQEe1TbN0KWTNbt.9EZxMQXZNo1A0"|' /tmp/config.ini 
+ sed 's|$SEARCH_PATTERN|\\1\\$REPLACE_PATTERN|' /tmp/config.ini 
[site] 
"name"="Site 0" 
[node] 
"name"="Node 0" 
[systemsecurity] 
[systemsecurity\webserver] 
"level"="high" 
[tacacs] 
"interface"="0" 
"enable"=dword:00000000 
"port"=dword:00000031 
"allowPersistentTCPConnections"=dword:00000001 
[misc] 
"adminsyspassword"="$ADMIN_PASSWD" 
"adminpassword"="MD5-71293d5fd498273ca795a80ea9fa73c7" 
"adminuser"="admin" 
[[email protected] ~]$ 

Я не могу понять, почему команда sed не работает для меня.

Где я ошибаюсь?

Update:

Я попытался добавить эхо команды в сценарии оболочки, чтобы увидеть, что на самом деле прошло.

echo "sed 's|$SEARCH_PATTERN|\\1\\$REPLACE_PATTERN|' /tmp/config.ini" 
sed 's|$SEARCH_PATTERN|\\1\\$REPLACE_PATTERN|' /tmp/config.ini 

Теперь расширенная версия работает, но как это сделать в сценарии оболочки?

[[email protected] ~]$ sed 's|^\(\"adminsyspassword\"\=\).*|\1\"$6$2qeizEuc$082jxqqkpJJPQuUbJD/aO2zA5SSmibjSY7cEDpNxj9eQhKxhO2NT40O9FmQEe1TbN0KWTNbt.9EZxMQXZNo1A0"|' /tmp/config.ini 
[site] 
"name"="Site 0" 
[node] 
"name"="Node 0" 
[systemsecurity] 
[systemsecurity\webserver] 
"level"="high" 
[tacacs] 
"interface"="0" 
"enable"=dword:00000000 
"port"=dword:00000031 
"allowPersistentTCPConnections"=dword:00000001 
[misc] 
"adminsyspassword"="$6$2qeizEuc$082jxqqkpJJPQuUbJD/aO2zA5SSmibjSY7cEDpNxj9eQhKxhO2NT40O9FmQEe1TbN0KWTNbt.9EZxMQXZNo1A0" 
"adminpassword"="MD5-71293d5fd498273ca795a80ea9fa73c7" 
"adminuser"="admin" 
[[email protected] ~]$ 

Спасибо за помощь. Я получил решение, нужно изменить в этом формате.

[[email protected] ~]$ cat /tmp/a.sh 
#! /bin/sh 

echo "Fetching the admin encrypted Password from the /etc/shadow file" 
ADMIN_PASSWD=`sudo awk -F: '/admin/ { print $2}' /etc/shadow` 

PARAM_TO_CHANGE='^\(\"adminsyspassword\"\=\)' 
ANYTHING='.*' 
SEARCH_PATTERN=${PARAM_TO_CHANGE}${ANYTHING} 
REPLACE_PATTERN="\"${ADMIN_PASSWD}\"" 

sed "s|$SEARCH_PATTERN|\\1\\$REPLACE_PATTERN|" /tmp/config.ini 
+0

Котировки пришли, потому что вы сознательно их туда. 'VARIABLE =" \ "VALUE \" "' помещает кавычки; вы, похоже, хотите «VARIABLE =» VALUE ». – tripleee

ответ

0

Проблема заключается в том, что с помощью одинарных кавычек при вызове команды sed предотвращает оболочку от переменной оболочки SEARCH_PATTERN и REPLACE_PATTERN. Это приводит к тому, что эти строки передаются буквально программе sed.

sed 's|$SEARCH_PATTERN|\\1$REPLACE_PATTERN|' /tmp/config.ini 

Для того чтобы оболочка могла выполнять расширение параметра, одинарные кавычки должны быть удалены или заменены двойными кавычками. Я хотел бы упростить команду sed для поиска символьной строки $ADMIN_PASSWD в /tmp/config.ini и заменить его содержимое переменной в ADMIN_PASSWD оболочки:

sed s/\$ADMIN_PASSWD/$ADMIN_PASSWD/ /tmp/config.ini 
Смежные вопросы