Сценарий оболочки 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] строки текста, которые следуют [ ... ] для вывода в конце текущего цикла или при чтении следующей строки ввода.