C script de shell último comando não está funcionando

1

Eu tenho este shell C (infelizmente C é necessário) script chamado EditFile.script consistindo inteiramente de 6 diferentes comandos sed, tudo para ser aplicado a um arquivo de texto.

#!/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

Agora, o arquivo de texto tem mais de 400 linhas e acho que postá-lo aqui (e sua forma desejada) seria um desperdício de espaço.

No entanto, quando executo sed -f EditFile.script GameManual no cmdline, todos os comandos acima funcionam exceto para o comando final. Não "Game Over" é anexado ao final do arquivo. Eu acredito que tem algo a ver com o anterior "excluir todas as linhas em branco /^ *$/d command- porque quando eu corri o script com ele removido," Game Over "foi acrescentado. Mas eu não vejo a conexão.

Por que o comando final sed no script não é exibido? Além disso, como esta é a primeira vez que uso um script csh (e shell c), que outras adições devo fazer para que o script funcione?

    
por KMoy 23.10.2016 / 18:58

1 resposta

2

Eu não acho que isso tenha algo a ver com o shell C - e, de fato, como observado nos comentários, o que você tem é um script sed (um arquivo de texto simples de sed comandos) em vez de um shell script, e o #!/bin/csh -f shebang é supérfluo e será tratado (por sed) como um simples comentário.

O que você parece estar observando é que sed aparece para não reavaliar o endereço $ (última linha), de modo que se um dos seus comandos anteriores apagar o último linha do arquivo, em seguida, uma tentativa subseqüente de anexar 1 após esse endereço falhar. Podemos ver isso com um teste simples (usando o bash shell, pelo que vale a pena) da seguinte forma:

# delete line 3 then append after $
$ printf 'line %d\n' {1..3} | sed -e '/3/d' -e '$a\new line'
line 1
line 2

enquanto

# 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

Acho isso um tanto surpreendente, mas não sei se é o comportamento desejado ou deveria ser considerado um bug.

Nota:

[1] Tecnicamente, o comando a não é anexado, mas sim

  

Fila [s] as linhas de texto que se seguem [...] para serem impressas no final do ciclo atual, ou quando a próxima linha de entrada é lida.

    
por steeldriver 23.10.2016 / 23:11