如何在sed命令中使用变量删除用户选定的行号
sed 命令中使用 Shell 变量的正确方法及问题修复
问题根源
你的代码无法生效有两个核心原因:
- Shell 中单引号包裹的字符串不会进行变量展开,你将
$lineNum写在单引号范围内时,Shell 不会把它替换成用户输入的行号值,只会把$lineNum作为普通字符串传给sed。 - 你额外加了转义的双引号,就算变量能正常展开,传给sed的规则会变成
"3"d(假设输入行号是3),sed无法识别带双引号的行号格式,自然无法执行删除。
修正方案
直接用双引号包裹sed的执行规则即可,双引号内的Shell变量会被正常展开,完整可用的代码如下:
echo '请输入你想要删除的行号:' read lineNum # 可选:校验输入是否为合法正整数,避免非法输入导致报错 if [[ ! $lineNum =~ ^[1-9][0-9]*$ ]]; then echo "错误:请输入合法的正整数行号" exit 1 fi # 可选:预览待删除行内容,避免误删 echo "待删除的行内容如下:" sed -n "${lineNum}p" speciesDetails.txt read -p "确认删除请输入y,其他输入将终止操作:" confirm if [[ $confirm == [yY] ]]; then # 绝大多数Linux系统(GNU sed环境)用下面这行 sed -i "${lineNum}d" speciesDetails.txt # macOS系统自带sed请把上面那行注释,替换为下面这行 # sed -i '' "${lineNum}d" speciesDetails.txt echo "已成功删除第${lineNum}行" fi
额外说明
如果一定要用单引号包裹sed规则的话,也可以把变量部分拆到单引号外面拼接,写法如下,不过不如直接用双引号简洁:
sed -i $lineNum'd' speciesDetails.txt
如果输入的行号超过文件总长度,sed不会报错也不会执行任何操作,属于正常行为。
内容的提问来源于stack exchange,提问作者KokaDoodles
相关产品推荐
相关产品推荐

