我有这个 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 -f
shebang 是多余的,并且将被(由 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
命令不是附加的,而是
将 [ ... ] 之后的文本行排队,以便在当前周期结束时或读取下一个输入行时输出。