sed:如何通过脚本文件禁用自动打印而不是使用 -n 开关?

sed:如何通过脚本文件禁用自动打印而不是使用 -n 开关?

我对命令行和脚本文件界面之间的切换这个主题感到困惑。我在命令行中编写了一个很好的脚本,可以运行,但是当我想将其保存到 .sed 文件时,我记得我不能再使用-n.sed文件了。我尝试使用“!d”标志,但没有得到相同的输出。我的问题:
有没有办法将其放入-n.sed 文件中,或者当我处于脚本文件界面时有其他方法来停止自动打印?我讨厌必须从保护我的脚本免受 shell 转换为不保护它,但我想没有办法解决它吗?

答案1

标准(POSIX)方法是#n在脚本的开头。它们必须是脚本的前两个字节。

这排除了 she-bang 的使用,它只能用于运行的脚本sed -f the-script(请注意,she-bangs 不是 POSIX 并且 POSIX 不指定实用程序的路径),但正如 @Kusalananda 所说,当使用 she -bang,你总是可以这样做:

#! /path/to/sed -nf

如果您想sed在支持带参数的 she-bangs(大多数)的系统上制作可执行脚本。

请注意,它#n也适用于命令行,如下所示:

sed '#n
  s/foo/bar/p'

您可以在“喜欢”之后添加更多文本:

#no default output
s/foo/bar/p

或者:

#nifty way to turn -n on
s/foo/bar/p

实际上,这是需要记住的事情,以避免-n错误打开。#为此(以及为了易读性),在注释后使用空格是个好主意。

# no, I don't want to turn -n on
s/foo/bar/

答案2

sed [-e] 'command'并且sed -f /path/to/script对于-n开关的行为方式完全相同。如果您想执行sed脚本并关闭“默认打印”行为,请使用sed -n -f /path/to/script.sed /path/to/input.

答案3

您必须sed使用以下命令运行脚本

$ sed -n -f script.sed

或者将#!脚本中的 ("hash-bang") 行更改为类似的内容

#!/usr/bin/sed -nf

并运行它

$ ./script.sed

相关内容