Сценарий оболочки C последняя команда не работает

У меня есть эта оболочка C (к сожалению, 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 в командной строке работают все вышеперечисленные команды, кроме последней команды. Никакая "Игра окончена" не добавлена ​​в конец файла. Я считаю, что это имеет отношение к предыдущему "удалить все пустые строки /^ *$/d команда - потому что когда я запустил сценарий со снятым сценарием, добавилось "Game Over" Но я не вижу связи.

Почему не будет показана последняя команда sed в сценарии? Кроме того, поскольку я впервые использую сценарий csh (и оболочку c), какие еще дополнения я должен сделать, чтобы скрипт работал?

1 ответ

Я не думаю, что это имеет какое-либо отношение к оболочке C - и на самом деле, как отмечено в комментариях, у вас есть сценарий sed (простой текстовый файл sed команды), а не сценарий оболочки, и #!/bin/csh -f Шебанг излишен и будет рассматриваться (как sed) как простой комментарий.

Вы, кажется, наблюдаете, что sed кажется, не переоценить $ адрес (последняя строка), так что если одна из ваших предыдущих команд удаляет последнюю строку файла, то последующая попытка добавить1 после этого адреса не удалась. Мы можем увидеть это с помощью простого теста (используя bash оболочка, для чего она стоит) так:

# 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 команда не добавляется, а скорее

Поставьте в очередь [s] строки текста, которые следуют [ ... ] для вывода в конце текущего цикла или при чтении следующей строки ввода.

Другие вопросы по тегам