У меня есть файл 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
Котировки пришли, потому что вы сознательно их туда. 'VARIABLE =" \ "VALUE \" "' помещает кавычки; вы, похоже, хотите «VARIABLE =» VALUE ». – tripleee