如何从用户获取inout并使用echo或sed修改文件

时间:2017-12-03 12:39:44

标签: php bash ssh

我使用以下代码从用户那里获取输入并修改我的backup.php文件:

#!/bin/bash
read -p "Enter hostname: " hostname
read -p "Enter cPanel username: " user
read -p "Enter password: " pass

echo "\$source_server_ip = \"$hostname\";" >> "backup.php"
echo "\$cpanel_account = \"$user\"; "      >> "backup.php"
echo "\$cpanel_password = \"$pass\"; "     >> "backup.php"

这完美无缺;但是,我想在backup.php中分别在行号4,5和6处插入用户提供的详细信息。

backup.php内容:

Line no. 1: php
Line no. 2: include xmlapi.php
Line no. 3: (blank)
Line no. 4: $source_server_ip = "   "; 
Line no. 5: $cpanel_account = "   ";
Line no. 6: $cpanel_password = "   "; 
Line no 7 L code continue..

我希望保持代码重置,并希望在线4,5.6行进行更改。

我该怎么做?我需要使用sed吗?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你需要使用一些新行替换/更新第4行,第5行和第6行。您可以使用s' s host_line="\$source_server_ip = \"$hostname\"" user_line="\$cpanel_account = \"$user\"" pass_line="\$cpanel_password = \"$pass\"" sed -i "4s/.*/$host_line/; 5s/.*/$user_line/; 6s/.*/$pass_line/" backup.php #different notation: sed -i -e "4s/.*/$host_line/" -e "5s/.*/$user_line/" -e "6s/.*/$pass_line/" backup.php ubstitution命令:

4s
  • .*确定替换命令应在哪一行(在本例中为第4行)

  • -i匹配整行,并将其替换为您的用户输入

  • sed是就地编辑。它将编辑您的文件,而不是将结果发送到stdin

警告使用s' sed命令非常简单,但如果您的变量包含未转义的特殊字符,则会产生一些令人惊讶且危险的结果{1}},例如:&/newline,...

或者使用sed' c命令:

sed -i "4c \
$host_line
5c \
$user_line
6c \
$pass_line
" backup.php

#different notatiton:
sed -i -e "4c $host_line" -e "5c $user_line" -e "6c $pass_line" backup.php

警告:您也可以通过未转义newline来解决此问题:

pass='mypass
2c oops'

您必须将这些特殊字符转义为sed或使用我认为最安全的解决方案awk

awk -i inplace -v hl="$host_line" -v ul="$user_line" -v pl="$pass_line" '
   NR==4 { $0=hl } 
   NR==5 { $0=ul }
   NR==6 { $0=pl }
   { print }'  backup.php

不要忘记在-r使用read选项,否则它会专门处理反斜杠。

另外,请注意,即使变量中的反斜杠也会被解释!如果要防止这种情况,可以使用参数扩展添加额外的反斜杠:

host_line="\$source_server_ip = \"${hostname//\\/\\\\}\""
user_line="\$cpanel_account = \"${user//\\/\\\\}\""
pass_line="\$cpanel_password = \"${pass//\\/\\\\}\"" 

编辑:如果您只想在第3行之后插入 3行,请使用这个简单的sed

sed -i "4i $host_line\n$user_line\n$pass_line" backup.php