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

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

1
задан 23 October 2016 в 19:58

1 ответ

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

То, что Вы, кажется, наблюдаете, является этим sed кажется, не переоценивает $ (последняя строка) адрес, так, чтобы, если одна из Ваших предыдущих команд, оказывается, удаляет последнюю строку файла, то последующая попытка к append1 после того адреса сбои. Мы видим это с простым тестом (использующий 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] Techically, a команда не добавляет, а скорее

Очередь [s] строки текста, которые следуют [...], чтобы быть произведенными в конце текущего цикла, или когда следующая входная строка читается.

2
ответ дан 7 December 2019 в 13:40

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

Похожие вопросы: