Edição de Fluxo no Linux

LinuxBeginner
Pratique Agora

Introdução

Bem-vindo ao laboratório de edição de fluxo Linux. Neste laboratório, você aprenderá a usar o sed (Stream Editor), um utilitário de linha de comando poderoso para análise e transformação de texto. O sed é usado para realizar transformações básicas de texto em um fluxo de entrada (um arquivo ou entrada de um pipeline).

Ao final deste laboratório, você será capaz de:

  • Realizar substituições básicas de texto com sed
  • Editar arquivos in-place usando sed
  • Aplicar substituições globais em arquivos inteiros
  • Usar técnicas avançadas de processamento de texto

As habilidades que você aprenderá o ajudarão a manipular arquivos e fluxos de texto de forma eficiente, o que é essencial para várias tarefas de administração de sistema e processamento de texto no Linux.

Uso Básico do sed e Substituição de Texto

Nesta etapa, aprenderemos os fundamentos do sed e como realizar substituições simples de texto. O comando sed é uma ferramenta poderosa de processamento de texto que permite pesquisar, encontrar e substituir, inserir e excluir texto em arquivos sem abri-los em um editor.

Primeiro, vamos verificar se o sed está instalado em nosso sistema executando:

which sed

Você deve ver uma saída semelhante a:

/usr/bin/sed

Isso confirma que o sed está disponível. Se, por algum motivo, ele não estiver instalado, você pode instalá-lo com:

sudo apt-get update
sudo apt-get install -y sed

Agora, vamos criar um arquivo de texto para trabalhar. Criaremos um arquivo chamado sample.txt no diretório atual:

echo "Linux is a powerful operating system." > ~/project/sample.txt
echo "Many users prefer Linux for servers." >> ~/project/sample.txt
echo "Linux has strong security features." >> ~/project/sample.txt

Vamos examinar o conteúdo do nosso novo arquivo:

cat ~/project/sample.txt

Você deve ver:

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

Agora, vamos usar sed para realizar uma substituição básica. O seguinte comando substituirá a primeira ocorrência de "Linux" por "Ubuntu" em cada linha:

sed 's/Linux/Ubuntu/' ~/project/sample.txt

Você deve ver:

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

Observe que o sed imprimiu o texto modificado na saída padrão (seu terminal), mas o arquivo original permanece inalterado. Você pode verificar isso executando:

cat ~/project/sample.txt

A saída ainda deve mostrar "Linux" e não "Ubuntu":

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

A sintaxe básica para a substituição sed é:

sed 's/pattern/replacement/' filename

Onde:

  • s é o comando de substituição
  • pattern é o texto que você deseja substituir
  • replacement é o novo texto
  • filename é o arquivo de entrada

Vamos tentar outro exemplo. Desta vez, substituiremos "powerful" por "versatile":

sed 's/powerful/versatile/' ~/project/sample.txt

Isso deve gerar:

Linux is a versatile operating system.
Many users prefer Linux for servers.
Linux has strong security features.

Edição In-place e Substituição Global

Na etapa anterior, aprendemos a usar sed para substituição básica de texto, mas as alterações foram exibidas apenas na tela, não sendo salvas no arquivo. Nesta etapa, aprenderemos a:

  1. Editar arquivos in-place com a opção -i
  2. Realizar substituições globais usando a flag g

Edição In-place

Para fazer alterações permanentes em um arquivo usando sed, usamos a opção -i. Essa opção modifica o arquivo diretamente, em vez de apenas imprimir a saída no terminal.

Vamos modificar nosso arquivo sample.txt substituindo "Linux" por "Ubuntu":

sed -i 's/Linux/Ubuntu/' ~/project/sample.txt

Ao contrário da etapa anterior, este comando não produz nenhuma saída visível. Vamos verificar o conteúdo do arquivo para ver se ele foi alterado:

cat ~/project/sample.txt

Você deve ver agora:

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

As alterações foram salvas no arquivo! Este é o poder da edição in-place com sed.

Substituição Global

Por padrão, sed substitui apenas a primeira ocorrência do padrão em cada linha. Para substituir todas as ocorrências, usamos a flag g (global) no final do comando de substituição.

Vamos criar um novo arquivo com texto repetido:

echo "The red car stopped at the red light near the red building." > ~/project/colors.txt

Agora, vamos usar sed sem a flag global para substituir "red" por "blue":

sed 's/red/blue/' ~/project/colors.txt

Você deve ver:

The blue car stopped at the red light near the red building.

Observe que apenas a primeira ocorrência de "red" foi substituída por "blue". Agora, vamos usar a flag global:

sed 's/red/blue/g' ~/project/colors.txt

A saída deve ser:

The blue car stopped at the blue light near the blue building.

Todas as ocorrências de "red" foram substituídas por "blue"!

Vamos aplicar isso ao nosso arquivo sample.txt. Primeiro, vamos adicionar mais ocorrências de "Ubuntu":

echo "Ubuntu is great. I use Ubuntu daily for my work with Ubuntu tools." >> ~/project/sample.txt

Agora, vamos substituir todas as ocorrências de "Ubuntu" por "Linux" usando a flag global e a edição in-place:

sed -i 's/Ubuntu/Linux/g' ~/project/sample.txt

Vamos verificar as alterações:

cat ~/project/sample.txt

Você deve ver:

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Linux is great. I use Linux daily for my work with Linux tools.

Todas as ocorrências de "Ubuntu" foram substituídas por "Linux" em todo o arquivo.

Criando um Backup Antes da Edição In-place

Ao usar a edição in-place, é frequentemente uma boa prática criar um backup do arquivo original. Você pode fazer isso fornecendo uma extensão para a opção -i:

sed -i.bak 's/Linux/Ubuntu/g' ~/project/sample.txt

Este comando irá:

  1. Criar um backup de sample.txt como sample.txt.bak
  2. Substituir todas as ocorrências de "Linux" por "Ubuntu" em sample.txt

Vamos verificar ambos os arquivos:

cat ~/project/sample.txt
cat ~/project/sample.txt.bak

O primeiro comando deve mostrar todos os "Linux" substituídos por "Ubuntu", enquanto o arquivo de backup ainda deve conter "Linux".

Comandos Avançados do sed e Correspondência de Padrões

Agora que dominamos a substituição básica e a edição in-place com sed, vamos explorar alguns recursos mais avançados:

  1. Usando delimitadores diferentes
  2. Usando intervalos de endereços para direcionar linhas específicas
  3. Combinando múltiplos comandos

Usando Delimitadores Diferentes

Embora tenhamos usado a barra / como delimitador em nossos comandos de substituição, o sed nos permite usar qualquer caractere como delimitador. Isso é especialmente útil quando o padrão ou o texto de substituição contém barras.

Vamos criar um arquivo com caminhos de arquivos:

echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt

Se quisermos substituir /usr/local/bin por /opt/bin, usar barras seria confuso:

sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt

Em vez disso, podemos usar um delimitador diferente, como #:

sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt

Isso é muito mais legível! A saída deve ser:

/opt/bin is in the PATH
My config is in /etc/myapp/config.json

Outros delimitadores comuns incluem |, :, e _.

Endereçamento - Direcionando Linhas Específicas

O sed nos permite especificar em quais linhas aplicar a substituição. Isso é feito prefixando o comando com um endereço.

Vamos criar um novo arquivo com linhas numeradas:

echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt

Para substituir "line" por "row" apenas na linha 3:

sed '3 s/line/row/' ~/project/numbered.txt

A saída deve ser:

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

Também podemos especificar um intervalo de linhas. Para substituir "line" por "row" nas linhas 2 a 4:

sed '2,4 s/line/row/' ~/project/numbered.txt

A saída deve ser:

Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

Outro recurso útil é a capacidade de corresponder linhas com base em um padrão. Por exemplo, para substituir "line" por "row" apenas nas linhas que contêm "third" ou "fourth":

sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt

A saída deve ser:

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

Combinando Múltiplos Comandos

Podemos combinar múltiplos comandos sed usando a opção -e ou separando os comandos com ponto e vírgula.

Vamos substituir "first" por "1st", "second" por "2nd" e "third" por "3rd" em um único comando:

sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt

Alternativamente, podemos usar ponto e vírgula:

sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

Ambos os comandos devem produzir a mesma saída:

Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

Vamos agora tornar essas alterações permanentes:

sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

E verificar as alterações:

cat ~/project/numbered.txt

Você deve ver o texto atualizado com números ordinais.

Trabalhando com Scripts sed

Nas etapas anteriores, executamos comandos sed diretamente da linha de comando. No entanto, para operações mais complexas, é frequentemente mais conveniente criar um arquivo de script sed. Isso nos permite:

  1. Organizar múltiplos comandos sed
  2. Adicionar comentários para explicar o que cada comando faz
  3. Reutilizar as mesmas operações em diferentes arquivos

Criando um Script sed

Vamos criar um script sed simples que realiza várias transformações de texto:

cat > ~/project/transform.sed << 'EOF'
## Replace "Linux" with "Ubuntu"
s/Linux/Ubuntu/g

## Replace "user" with "developer"
s/user/developer/g

## Replace "system" with "platform"
s/system/platform/g

## Convert "is" to uppercase
s/is/IS/g
EOF

Este script realiza quatro substituições:

  1. Substitui todas as ocorrências de "Linux" por "Ubuntu"
  2. Substitui todas as ocorrências de "user" por "developer"
  3. Substitui todas as ocorrências de "system" por "platform"
  4. Converte todas as ocorrências de "is" para "IS" em maiúsculas

Vamos criar um novo arquivo para testar nosso script:

cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

Executando um Script sed

Para executar nosso script sed no arquivo de teste, usamos a opção -f:

sed -f ~/project/transform.sed ~/project/test.txt

Você deve ver:

Ubuntu IS a powerful operating platform.
The developer interface IS very customizable.
Many Ubuntu developers prefer the command-line interface.
The platform resources are efficiently managed.

Todas as substituições do nosso script foram aplicadas!

Edição In-place com um Script

Assim como com os comandos sed da linha de comando, podemos usar a opção -i para realizar a edição in-place com um script:

sed -i -f ~/project/transform.sed ~/project/test.txt

Vamos verificar as alterações:

cat ~/project/test.txt

O arquivo agora deve conter o texto transformado.

Criando um Backup com um Script

E novamente, podemos criar um backup antes de fazer alterações:

## First, let's restore the original content
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

## Now run sed with a backup
sed -i.bak -f ~/project/transform.sed ~/project/test.txt

Vamos verificar tanto o arquivo modificado quanto o backup:

cat ~/project/test.txt
cat ~/project/test.txt.bak

O primeiro comando deve mostrar o texto transformado, enquanto o arquivo de backup deve conter o texto original.

Aplicando um Script sed a Múltiplos Arquivos

Uma das vantagens de usar um script sed é que podemos facilmente aplicar as mesmas transformações a múltiplos arquivos.

Vamos criar mais alguns arquivos de teste:

## Create test1.txt
cat > ~/project/test1.txt << 'EOF'
Linux offers excellent system performance.
Many users appreciate its stability.
EOF

## Create test2.txt
cat > ~/project/test2.txt << 'EOF'
The Linux community provides great support.
New users can find helpful resources online.
EOF

## Create test3.txt
cat > ~/project/test3.txt << 'EOF'
The system updates are well-managed in Linux.
Users can customize their experience.
EOF

Agora, vamos aplicar nosso script sed a todos esses arquivos de uma vez:

sed -i -f ~/project/transform.sed ~/project/test1.txt ~/project/test2.txt ~/project/test3.txt

Vamos verificar as alterações:

cat ~/project/test1.txt
cat ~/project/test2.txt
cat ~/project/test3.txt

Todos os três arquivos devem mostrar o texto transformado de acordo com nosso script.

Isso demonstra o poder dos scripts sed para processamento em lote de múltiplos arquivos com o mesmo conjunto de transformações.

Resumo

Neste laboratório, você aprendeu a usar sed, o Stream Editor, para manipular arquivos de texto no Linux. Você adquiriu experiência prática com vários aspectos importantes do sed:

  • Substituição básica de texto usando o comando s
  • Edição in-place com a opção -i
  • Substituição global com a flag g
  • Criação de backups antes da edição com a opção -i.bak
  • Usando delimitadores diferentes para padrões de substituição
  • Direcionando linhas específicas com endereços e intervalos
  • Criando e executando scripts sed para operações mais complexas
  • Aplicando transformações a múltiplos arquivos de uma vez

Essas habilidades são essenciais para o processamento eficiente de texto em ambientes Linux. A capacidade de manipular arquivos de texto sem abri-los em um editor é particularmente valiosa para administradores de sistema, desenvolvedores e analistas de dados que frequentemente precisam processar grandes volumes de dados de texto ou fazer alterações sistemáticas em vários arquivos.

À medida que você continua a trabalhar com Linux, você descobrirá que sed é uma ferramenta indispensável em seu kit de ferramentas de processamento de texto, juntamente com outros utilitários como grep, awk e cut.