Adicionando uma macro TeX ao início de um arquivo usando sed (por que o meu método não funciona?)

4

Eu preciso adicionar uma linha ao início de um arquivo. A linha em questão é

\def\submit{}

Eu tenho uma solução semi-working usando sed . Eu não sei sed , mas consegui de algum lugar na net, mas não funciona direito, porque insere um espaço indesejado no começo da linha. Embora isso realmente não importe, acho que posso fazer isso direito.

sed -i '1i\ \\def\\submit{}' 'dirname/filename'

Parece, pela minha leitura, que todas essas barras invertidas extras são necessárias para escapar do shell. Outras soluções também são bem-vindas, mas eu gostaria de um forro comparativamente compacto, se possível. Obrigado.

Esta questão, Inserir texto no início de um arquivo com sed através do terminal no Linux é semelhante, mas não me ajuda a depurar minha expressão.

EDIT: Eu aceitei a resposta de @ Jonathan, porque explica o que estava errado com a minha abordagem anterior. No entanto, também adicionei uma resposta.

    
por Faheem Mitha 21.09.2011 / 18:51

4 respostas

4

Eu não tenho acesso ao sed agora, então não tenho certeza se isso está correto, mas acho que você só precisa remover a primeira barra invertida e o espaço depois dela.

sed -i '1i\\def\\submit{}' 'dirname/filename'

Experimente e veja se isso funciona.

    
por 21.09.2011 / 19:00
5

sed é para editar fluxos - um arquivo não é um fluxo. Use um programa destinado a esse propósito, como ed ou ex . A opção -i para sed não é apenas não portável, mas também irá quebrar quaisquer links simbólicos para o seu arquivo, já que essencialmente o exclui e recria, o que é inútil.

ed -s [file] << EOF
0a
\def\submit{}
.
w
EOF
    
por 21.09.2011 / 20:15
2

Consegui obter uma versão funcional usando uma resposta para: "Como posso preceder uma tag ao início de vários arquivos? ".

Eu não estava ciente desta questão. A solução é:

sed -i '1s/^/\\def\\submit{}\n/' 'dirname/filename'

BTW, penso: "Como posso adicionar uma tag ao início de vários arquivos?" Seria uma questão melhor para referenciar do que a seguinte: "Inserindo texto no início de um arquivo com sed através do terminal no Linux" ao qual esta questão estava vinculada. Tem muito mais respostas.

    
por 19.01.2014 / 16:55
0

Primeiro: as barras invertidas de escape não são por causa do shell - a string é simples. Pelo contrário, é por causa do sed em si.

Em segundo lugar: a resposta de Chris Down tem algum mérito - não use martelo em vez de chave de fenda. Por outro lado, portabilidade e links simbólicos nem sempre são um problema, se for o caso, ambos

sed '1i\\def\submit{}'

e

sed '1i\def\submit{}\'

Deve fazer o que você precisa. Eu não fui capaz de descobrir por que a barra invertida na última forma desativa escapar na string, mas parece funcionar assim, pelo menos no GNU sed quando os comandos são colocados em uma linha de comando. Quando usado em um script, apenas o primeiro formulário parece funcionar (porque a barra invertida é usada para denotar o fim da linha que é seguido por outro):

#!/bin/sed -f 
1i\
\def\submit{}              
    
por 19.01.2014 / 22:37