sed
的手册页内容如下:
sed [-Ealnru] command [-I extension] [-i extension] [file ...]
基于此,我认为以下应该有效:
sed -E '/^A/d' -i '' tmp.txt
其中
cat tmp.txt
给出:
A
B
但是输出是:
sed: -i: No such file or directory
sed: : No such file or directory
B
并且
tmp.txt
保持不变。
为了使上述命令正常工作,我应该执行以下操作:
sed -E -i '' '/^A/d' tmp.txt
我的问题是,为什么?根据手册页,我首先尝试的应该是有效的。选项的顺序正如那里所描述的那样。然而它并没有起作用。
我的 Mac 运行的是 macOS 12,它基于 FreeBSD。
POSIX 实用程序语法指南 指定选项(包括带有选项参数的选项)应位于位置参数之前。虽然 GNUish 命令行解析器将识别后面位置的选项,只要它们前面没有选项结束标志,但这种行为(正如您所观察到的)不会扩展到非 GNU 实现。
这意味着显示
-i
coming after 要运行的表达式的文档是错误的。如下重新排列你的论点:
sed -E -i '' '/^A/d' tmp.txt