2016-06-07 123 views
0

我有一個名爲config.ini的文件,位於say/tmp位置。 以下內容。使用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] ~]$ 

而且我需要用/ etc/shadow文件值中存在的值替換「adminsyspassword」。我用awk命令使用下面的shell腳本來獲取ini文件的「adminsyspassword」鍵的新值。

[[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變量中。並且在調試格式下運行shell腳本時捕獲$ 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命令不適用於我。

我哪裏去錯了?

更新:

我試着在shell腳本中加入echo命令,看看什麼是真正過去了。

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

現在擴大版本正在工作,但如何使它在shell腳本?

[[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_PATTERNREPLACE_PATTERN殼變量。這導致這些字符串被直接傳遞給sed程序。

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

對於執行參數擴展的shell,應該刪除單引號或用雙引號替換單引號。我將簡化sed命令/tmp/config.ini搜索的文本字符串$ADMIN_PASSWD並與ADMIN_PASSWD shell變量的內容替換它:

sed s/\$ADMIN_PASSWD/$ADMIN_PASSWD/ /tmp/config.ini