我有以下名为“file”的 bash 文件(真正的文件做了一些有用的事情):
ed db/seeds.rb <<EOF
1,$-1d
a
123
456
.
w
q
EOF
当我运行“bash file”时,它不会删除任何行。如果我使用,1d
它1,$-1d
会删除第一行。
为什么这不起作用?我可以轻松找到解决方法,但我很好奇为什么这不起作用。
答案1
问题在于 shell 正在解释命令$
中的1,$-1d
。(具体来说,在我的测试中,它将其解释$-
为标志集合set
。)解决此问题的最佳方法是引用或转义字符串EOF
,例如
ed db/seeds.rb <<\EOF
或者
ed db/seeds.rb <<"EOF"
$
或者,您可以在“此处的文档”中对每个内容进行转义(即在前面加上反斜杠) 。
答案2
sed
在这种情况下更简单。选择以下之一:
sed -i -n '$p' file
sed -i '$!d' file
您的代码中的错误是 shell$-
在将脚本传递给 之前进行了扩展ed
。这将起作用:
# quoting the heredoc word:
ed db/seeds.rb <<'EOF'
1,$-1d
w
q
EOF