我使用以下代码从用户那里获取输入并修改我的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吗?
答案 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