logo

Comando Sed em Linux/Unix com exemplos

O comando 'sed' do Linux significa editor de fluxo. É usado para editar fluxos (arquivos) usando expressões regulares. Mas esta edição não é permanente. Ele permanece apenas na exibição, mas na verdade o conteúdo do arquivo permanece o mesmo.

Principalmente, é usado para substituição de texto; além disso, pode ser usado para outras operações de manipulação de texto, como inserir, excluir, pesquisar e muito mais. O comando sed nos permite editar arquivos sem abri-los. O suporte a expressões regulares o torna uma ferramenta de manipulação de texto mais poderosa.

Visão geral do comando sed

É um utilitário Unix que transforma e analisa texto com uma linguagem de programação compacta e simples. Foi integrado de 1973 a 1974 por Lee E. McMahon do Bell Labs e está presente hoje em quase todos os sistemas operacionais. O comando sed foi baseado nos aspectos de script do qed anterior (editor rápido) e do editor interativo ed. Foi a primeira ferramenta para suportar expressões regulares e permanece ativa para processamento de texto, principalmente com o comando de substituição. Ferramentas alternativas famosas incluem Perl e AWK para 'edição de fluxo' e manipulação de strings de texto simples.

Modo de operação do comando sed

O comando sed é um utilitário orientado a linha de processamento de texto: ele lê linha por linha o texto de um arquivo ou fluxo de entrada em um buffer interno conhecido como espaço padrão. Todas as leituras de linha iniciam um ciclo. O comando sed usa uma ou várias operações que foram descritas por um script sed para o espaço padrão. Ele opera uma linguagem de programação usando cerca de 25 comandos que descrevem as operações no texto.

Para todas as linhas de entrada, o comando sed normalmente resulta no espaço padrão e inicia o ciclo com a próxima linha novamente após a execução do script. Outras naturezas de fim de script estão disponíveis em comandos de script e opções de conjunto, por exemplo, N para incluir imediatamente a próxima linha no espaço padrão, q para sair, d para remover o espaço padrão e assim por diante. Conseqüentemente, um script sed está relacionado a um corpo de loop que itera a partir de um streamline, no qual a variável de loop e o próprio loop são mantidos e implícitos por sed.

  • Um script sed pode ser descrito na linha de comando ou lido em um arquivo isolado. No script sed, os comandos podem ter um endereço extra no contexto de expressões regulares ou números de linha. O endereço decide quando o comando é executado. Por exemplo, 2d executará apenas o comando d (ou delete) na segunda linha de entrada, enquanto /^ /d removerá todas as linhas começando com um espaço.
  • O espaço de espera, um buffer especial isolado, pode ser usado por alguns comandos sed para armazenar um texto acumulado entre os ciclos. A linguagem de comando do sed possui apenas duas variáveis ​​(espaço de padrão e espaço de espera) e funcionalidade de ramificação semelhante a GOTO. No entanto, a linguagem é Turing-completa. Scripts sed esotéricos estão disponíveis para vários jogos como tetris, xadrez, arkanoid e sokoban.
  • O loop principal é executado em todas as linhas do fluxo de entrada, verificando o script sed em todas as linhas da entrada. As linhas do script sed são todas um par padrão-ação, representando qual padrão combinar e qual ação implementar, que pode ser copiado como uma instrução condicional. As ações padrão (imprimir espaço padrão, copiar linha para o espaço padrão), fluxos de entrada e saída e variáveis ​​de trabalho (espaço de espera e espaço padrão) são implícitas; é possível especificar programas concisos de uma linha por causa do loop principal.

Uso do comando sed

    Comando de substituição
    O exemplo abaixo representa o comando mais típico e o uso mais típico do comando sed, ou seja, substituição. O uso foi a motivação real para o comando sed:
    sed 's/regexp/replacement/g' inputFileName > outputFileNameOutros comandos do sed
    Outras formas também são possíveis para processamento simples com cerca de 25 comandos sed. Por exemplo, abaixo usa a opção d para filtrar linhas que incluem apenas espaços e o final do caractere de linha:
    sed '/^ *$/d' inputFileName
    O exemplo acima usa alguns dos metacaracteres de expressão regular abaixo:
    • O sinal de intercalação (^) é igual ao início da linha.
    • O símbolo do dólar ($) é igual ao final da linha.
    • O asterisco (*) é igual à ocorrência anterior de mais ou zero caracteres.
    • O símbolo de mais (+) é igual a uma ou várias ocorrências de caracteres anteriores.
    • O ponto de interrogação (?) é igual à ocorrência de mais ou zero caracteres anteriores.
    • O símbolo de ponto (.) é exatamente igual a um caractere.
    sed como filtro
    Freqüentemente, o comando sed é usado como filtro dentro de um pipeline no Unix:
    $gerarDados | sed 's/x/y/g'
    O programa generateData gera dados e o comando sed faz uma pequena alteração substituindo x no lugar de y.Scripts sed baseados em arquivo
    Muitas vezes, é útil colocar muitos comandos sed, um único comando por cada linha, dentro de um arquivo de script e usar o sinalizador -f para executar os comandos do arquivo:
    sed -f subst.sed nome do arquivo de entrada > nome do arquivo de saída

Sintaxe:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Opções:

A seguir estão algumas opções de linha de comando do comando sed:

-n, --quiet, --silent: Isso nos permite imprimir com força o espaço do padrão.

-e script, --expressão=script: É usado para adicionar o script aos comandos a serem executados.

-f arquivo de script, --file=arquivo de script: É usado para adicionar o conteúdo do arquivo de script aos comandos a serem executados.

--follow-links simbólicos: ele é usado para seguir links simbólicos durante o processamento no local.

-i[SUFFIX], --in-place[=SUFFIX]: ele é usado para editar arquivos no local (cria backup se a opção SUFFIX for fornecida).

-l N, --comprimento da linha=N: É usado para especificar o comprimento de quebra de linha desejado para o comando `l'.

--posix: é usado para desabilitar todas as extensões GNU.

aleatório c

-E, -r, --regexp-estendido: Ele nos permite usar expressões regulares estendidas no script (para portabilidade use POSIX -E).

-s, --separado: ele é usado para considerar os arquivos como separados, em vez de como um único, e continua o longo fluxo.

--caixa de areia: É usado para operar no modo sandbox.

-você, --sem buffer: Ele é usado para carregar quantidades mínimas de dados dos arquivos de entrada e liberar os buffers de saída com mais frequência.

-z, --null-dados: É usado para separar linhas por caracteres NUL.

--ajuda: é usado para exibir o manual de ajuda.

--versão: É usado para exibir informações de versão.

Exemplos de comando sed

Vejamos os seguintes exemplos:

Aplicando ao diretório STDIN

O comando sed não se limita apenas a manipular arquivos; além disso, podemos aplicá-lo ao diretório STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Os comandos acima substituirão o primeiro texto pelo segundo padrão de texto. Considere a saída abaixo:

Filtro Sed do Linux

A partir da saída acima, primeiro executamos o comando 'sed' em uma string 'class7' onde 'class' é alterado para 'jtp' e 7 para 10. Em seguida, executamos o comando 'sed' em um stream 'msg.txt ' onde 'aprender' é convertido em 'estudar'.

Substituição Global

No exemplo anterior, todas as palavras 'aprender' não foram editadas em 'estudo'. Para editar cada palavra, temos que usar um substituto global 'g'. Ele editará todas as palavras especificadas em um arquivo ou string.

fatia de matriz java

Sintaxe:

 command | sed 's///g' 

Considere os exemplos abaixo:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Os comandos acima substituirão todo o padrão de texto especificado. Considere a saída abaixo:

Filtro Sed do Linux

A partir da saída acima, executando o comando 'echo class7 class9 | sed 's/class/jtp/g'' toda a 'classe' é convertida em 'jtp' e com o comando 'cat msg.txt | sed 's/learn/study/g'' todo o 'learn' foi convertido em 'study'.

Removendo uma linha

A opção 'd' nos permitirá remover uma linha completa de um arquivo. Precisamos apenas especificar uma palavra dessa linha com a opção 'd', e essa linha será excluída. Porém, observe que todas as linhas com a mesma palavra serão excluídas. Será executado como:

 cat | sed '//d' 

Considere o comando abaixo:

 cat msg.txt | sed '/jtp/d' 

O comando acima irá deletar as linhas que possuem a palavra ‘jtp’. Considere a saída abaixo:

Filtro Sed do Linux

A partir da saída acima, executando o comando 'cat msg.txt | sed '/jtp/d'' todas as linhas contendo a palavra 'jtp' são excluídas.

Usando o comando sed múltiplo

A opção '-e' nos permite executar vários comandos sed de uma só vez. Podemos realizar mais de uma operação sed executando o comando como:

 sed -e ' ; ' 

Considere o comando abaixo:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

O comando acima aplicará todas as operações especificadas no arquivo 'exm.txt'. Considere a saída abaixo:

Filtro Sed Linux

Como podemos ver na saída acima, todas as palavras ‘vermelhas’ são substituídas por ‘azul’ e todas as palavras ‘amarelas’ são substituídas por ‘preto’. Também podemos separar comandos como este:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

O resultado será o mesmo do comando acima.

Lendo comandos de um arquivo

Podemos salvar os comandos sed em um arquivo e aplicá-los imediatamente em qualquer arquivo. Isso pode ser feito especificando a opção '-f' da seguinte forma:

 sed -f 

No comando acima, '' é um arquivo que possui uma lista de comandos sed. Considere o comando abaixo:

 sed -f SedCommands exm.txt 

O comando acima aplicará todos os comandos especificados no arquivo ‘SedCommand’ em ‘exm.txt’. Considere a saída abaixo:

Filtro Sed do Linux

Na saída acima, usamos comandos aplicados ao exemplo anterior. Portanto, a saída é a mesma do exemplo anterior.

Substituindo Personagens

Podemos usar o ponto de exclamação (!) como delimitador de string. Por exemplo, queremos substituir o shell bash e substituí-lo pelo shell csh em '/etc/passwd'. Para fazer isso, execute o comando abaixo:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Podemos obter o mesmo resultado executando o comando abaixo:

mostrar aos usuários mysql
 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Limitando o sed

O uso básico do comando sed processa o arquivo inteiro. Porém, podemos limitar o comando sed e especificar qualquer linha. Existem duas maneiras de limitar o comando sed:

  • Uma série de linhas.
  • Um padrão que corresponde a uma linha específica.

Podemos fornecer um número para especificar uma linha da seguinte maneira:

 sed '3s/Red/Blue/' exm.txt 

O comando acima aplicará a operação especificada na terceira linha. Considere a saída abaixo:

Filtro Sed do Linux

Na saída acima, apenas a linha três é modificada.

Também podemos especificar um intervalo de linhas. Para especificar um intervalo de linhas, execute o comando da seguinte forma:

 sed '1,3s/Red/Blue/' exm.txt 

O comando acima atualizará o texto especificado nas linhas 1 e 3. Considere a saída abaixo:

Filtro Sed do Linux

Inserindo e Anexando Texto

Os sinalizadores 'i' e 'a' são usados ​​para inserir e anexar o texto em um arquivo. O sinalizador 'i' adicionará o texto antes da string, e o sinalizador 'a' é usado para adicionar texto após a string. Considere o comando abaixo:

 echo 'Another Demo' | sed 'iFirst Demo' 

O comando acima irá inserir o texto antes do texto ‘Another Demo’. Considere a saída abaixo:

Filtro Sed do Linux

Para acrescentar texto, execute o comando da seguinte forma:

 echo 'Another Demo' | sed 'aFirst Demo' 

O comando acima anexará o texto. Considere a saída abaixo:

Filtro Sed do Linux

Modificando Linhas

O sinalizador 'c' é usado para modificar uma linha específica. Para modificar uma linha, execute o comando da seguinte forma:

 sed '3cThis is a modified line.' exm.txt 

O comando acima irá atualizar a linha três. Considere a saída abaixo:

o que é jquery
Filtro Sed do Linux

Também podemos usar uma expressão regular para atualizar mais de uma linha com o mesmo padrão. Considere o comando abaixo:

 sed '/Apple is /c Line updated.' exm.txt 

O comando acima irá atualizar todas as linhas que possuem a string 'Apple is'. Considere a saída abaixo:

Filtro Sed do Linux

Transformação de Personagens

O sinalizador 'y' é usado para transformar os caracteres. A transformação de personagens não pode ser limitada a ocorrências específicas. Para transformar caracteres, execute o comando da seguinte forma:

 sed 'y/abc/def/' exm.txt 

O comando acima irá transformar os caracteres ‘a’, ‘b’, ‘c’ em ‘d’, ‘e’, ‘f’. considere a saída abaixo:

Filtro Sed do Linux

Imprimindo os números de linha

O sinal '=' é usado para imprimir o número da linha. Para imprimir o número da linha, execute o comando da seguinte forma:

 sed '=' exm.txt 

O comando acima exibirá o número da linha do conteúdo do arquivo. Considere a saída abaixo:

Filtro Sed do Linux

O sinal de igual com a opção '-n' especifica o número da linha que contém um script correspondente. Considere a saída abaixo:

 sed -n '/mango/=' exm.txt 

O comando acima exibirá o número da linha que contém a palavra ‘manga’. Considere a saída abaixo:

Filtro Sed do Linux

Na saída acima, podemos ver que a linha número 2 contém a palavra ‘manga’.