我正在使用以下代码从用户获取输入并修改我的 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 行插入用户提供的详细信息。
备份.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 吗?
如果我理解正确,您需要用一些新行替换/更新第 4、5 和 6 行。您可以为此使用sed
'ss
替换命令:
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
4s
确定替换命令应该发生在哪一行(在这种情况下是第 4 行)
.*
匹配整行并将其替换为您的用户输入
-i
是就地编辑。它将编辑您的文件而不是将结果发送到标准输入警告: usingsed
的s
命令非常简单,但如果您的变量包含未转义的特殊字符 to sed
,它可能会产生一些令人惊讶和危险的结果,例如:&
, /
, newline
, ...
或者使用sed
'sc
命令:
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
选项 withread
否则它会特别对待反斜杠。
另外,请注意,即使变量中的反斜杠稍后也会被解释!如果要防止出现这种情况,可以使用参数扩展添加额外的反斜杠:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句