C shell 脚本最后一个命令不起作用

C shell 脚本最后一个命令不起作用

我有这个 C shell(不幸的是需要 C)脚本,它EditFile.script完全由 6 个不同的 sed 命令组成,所有命令都将应用于一个文本文件。

#!/bin/csh -f

1i GameTime!!!!!!\n #append "GameTime!!!!!! at the beginning
s/pionts/points/g #sub typo
s/shot/shoot/g #sub typo
s/the\sthe/the/g #sub double the's with "the"
/^ *$/d #delete all blank lines
$a Game\nOver #append "Game Over" to the end of the file

现在文本文件有 400 多行长,我认为将其发布在这里(及其所需的格式)会浪费空间。

但是,当我sed -f EditFile.script GameManual在命令行运行上述所有命令时除了最后一个命令。文件末尾没有附加“Game Over”。我相信它与前面的“删除所有空白行”/^ *$/d命令有关 - 因为当我运行删除了它的脚本时,附加了“Game Over”。但我看不出其中的联系。

为什么脚本中的最后一个 sed 命令不显示?另外,由于这是我第一次使用 csh 脚本(和 c shell),我还必须添加哪些内容才能使脚本正常运行?

答案1

我认为这与 C shell 没有任何关系 - 事实上,正如评论中指出的那样,你所拥有的是一个sed 脚本(一个简单的命令文本文件sed)而不是一个 shell 脚本,并且#!/bin/csh -fshebang 是多余的,并且将被(由 sed)视为一个简单的注释。

你似乎观察到的是sed 出现不重新评估$(最后一行)地址,这样如果您之前的命令之一恰好删除了文件的最后一行,则随后在该地址后附加1 的bash尝试将失败。我们可以通过一个简单的测试(使用shell,就其价值而言)看到这一点,如下所示:

# delete line 3 then append after $
$ printf 'line %d\n' {1..3} | sed -e '/3/d' -e '$a\new line'
line 1
line 2

然而

# append after $ then delete line 3
$ printf 'line %d\n' {1..3} | sed -e '$a\new line' -e '/3/d'
line 1
line 2
new line

我发现这有点令人惊讶,但不知道这是否是所需的行为或应该被视为错误。


笔记:

[1] 从技术上讲,该a命令不是附加的,而是

将 [ ... ] 之后的文本行排队,以便在当前周期结束时或读取下一个输入行时输出。

相关内容