shell - remover - sed substituir caracteres especiais/




Inserir linha após o primeiro jogo usando sed (5)

Por alguma razão eu não consigo encontrar uma resposta direta para isso e estou com um pouco de tempo no momento. Como eu poderia inserir uma linha de texto de escolha após a primeira linha que corresponde a uma string específica usando o comando sed . Eu tenho ...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

E eu quero inserir uma linha após o CLIENTSCRIPT= linha resultando em ...

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

Comando Sed que funciona no MacOS (pelo menos, OS 10) e no Unix (ou seja, não requer gnu sed como o de Gilles (atualmente aceito)):

sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file

Isso funciona no bash e talvez em outros shells que conhecem o estilo de cotação de avaliação $ '\ n'. Tudo pode estar em uma linha e funcionar em comandos antigos / POSIX sed. Se houver várias linhas correspondentes ao CLIENTSCRIPT = "foo" (ou seu equivalente) e você desejar adicionar apenas a linha extra pela primeira vez, poderá refazê-lo da seguinte maneira:

sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file

(isso cria um loop após o código de inserção de linha que apenas percorre o restante do arquivo, nunca voltando ao primeiro comando sed novamente).

Você pode notar que eu adicionei um '^ *' ao padrão correspondente, caso essa linha apareça em um comentário, digamos, ou seja recuada. Não é 100% perfeito, mas abrange algumas outras situações que podem ser comuns. Ajuste conforme necessário ...

Essas duas soluções também contornam o problema (para a solução genérica de adicionar uma linha) que, se a nova linha inserida contiver barras invertidas ou e comercial, elas serão interpretadas por sed e provavelmente não serão as mesmas, assim como o \n é - por exemplo. \0 seria a primeira linha correspondida. Especialmente útil se você estiver adicionando uma linha que vem de uma variável onde você teria que escapar primeiro usando $ {var //} antes, ou outra declaração sed etc.

Esta solução é um pouco menos confusa em scripts (que citando e \ n não é fácil de ler), quando você não quer colocar o texto de substituição para o comando a no início de uma linha, digamos, em uma função com linhas recuadas. Eu aproveitei que $ '\ n' é avaliado para uma nova linha pelo shell, não é em valores de aspas simples '\ n'.

Está ficando bastante tempo entretanto que eu penso que perl / até mesmo awk poderia ganhar devido a ser mais legível.


Eu recentemente tive que lidar com isso, mas não apenas para um arquivo, mas vários arquivos diferentes que eu não poderia fazer à mão. Então eu tive que encontrar um roteiro para isso.

Download de script: kinglazy-autoinsert.sh

Uso:

kinglazy-autoinsert.sh (list_file) (pattern_file)

Explicação dos parâmetros:

list_file = Este é o arquivo que contém o caminho absoluto da lista de arquivos que você deseja editar

pattern_file = Este é o arquivo onde você especifica o padrão (na primeira coluna) sob o qual você deseja adicionar um novo texto. O novo texto para adicionar sob o padrão é especificado na segunda coluna. E é sobre isso!

Este script economiza tempo e ajuda você a fazer o trabalho com o menor esforço possível.

Dependências: nenhuma


Observe a sintaxe padrão do sed (como em POSIX, portanto, suportada por todas as implementações de sed conformidade (GNU, OS / X, BSD, Solaris ...)):

sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file

Ou em uma linha:

sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file

( -e xpressions (e o conteúdo de -f iles) são unidos com novas linhas para compilar as interpretações sed do sed script).

A opção -i para edição no local também é uma extensão GNU, algumas outras implementações (como o FreeBSD) suportam -i '' para isso.

Como alternativa, para portabilidade, você pode usar perl vez disso:

perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file

Ou você poderia usar ed ou ex :

printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file

Talvez um pouco tarde para postar uma resposta para isso, mas eu achei algumas das soluções acima um pouco complicadas.

Eu tentei substituição de seqüência de caracteres simples no sed e funcionou:

sed 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

& sign reflete a string combinada e, em seguida, você adiciona \ n e a nova linha.

Como mencionado, se você quiser fazer isso no local:

sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file

Outra coisa. Você pode combinar usando uma expressão:

sed -i 's/CLIENTSCRIPT=.*/&\nCLIENTSCRIPT2="hello"/' file

Espero que isso ajude alguém


Um compatível com POSIX usando o comando s :

sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file




sed