У меня есть эта оболочка 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), что другие дополнения я должен сделать, чтобы сценарий работал?
Я не думаю, что это имеет какое-либо отношение к оболочке 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] строки текста, которые следуют [...], чтобы быть произведенными в конце текущего цикла, или когда следующая входная строка читается.