如何使用 unix ed 编辑器从 bash 脚本中删除除最后一行之外的所有行

如何使用 unix ed 编辑器从 bash 脚本中删除除最后一行之外的所有行

我有以下名为“file”的 bash 文件(真正的文件做了一些有用的事情):

ed db/seeds.rb <<EOF
1,$-1d
a
123
456
.
w
q
EOF

当我运行“bash file”时,它不会删除任何行。如果我使用,1d1,$-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

相关内容