sed

Exemplos Bash Sed

Exemplos Bash Sed
O Bash permite que você execute a substituição de padrões usando a expansão de variável como ($ var / padrão / substituição). E então, o sed assim (sed -e 's / padrão / substituição /'). No entanto, há mais no sed do que apenas substituir padrões em arquivos de texto.  Aqui vamos redescobrir o sed, por exemplo, com comandos e fluxos de trabalho equivalentes para ajudar nas tarefas do dia a dia.

Configuração para exemplos sed

Aqui está um guia rápido para configurar o exemplo, que tentarei não exagerar.

“Palavras” é um arquivo de texto contendo os números de 1 a 100. Se você não tiver certeza do comando para criá-lo, consulte Função de exportação para xargs em Comando de exportação Bash. Você nunca sabe que pode ser em sua próxima entrevista de script de shell.

“Bar” é um arquivo de texto contendo uma única linha -.

“Old-php” é um arquivo de texto contendo linhas de PHP antigo que irão quebrar no php7 ou posterior. (Dica: ereg)

Observe que todas as funções descritas acima podem ser encontradas abaixo na nota final sobre funções para configuração.

Exemplos sed com comandos equivalentes

Em um ambiente de linha de comando, você descobrirá que há mais de uma solução para uma determinada tarefa. No entanto, na maioria das vezes, você deseja seguir o caminho que produza menos resistência. Aqui está uma lista de exemplos de comandos sed com comandos equivalentes correspondentes, onde alguns serão abordados em detalhes abaixo.

1. Imprime uma linha aleatória (equivalente a classificar -R - | cabeça -1)

sed -n "$ ((RANDOM% 100)) p" -

2.Imprime a última linha do arquivo (equivalente ao cabeçalho -1 -)

sed -n '$ p' -

3. Imprime as primeiras 10 linhas em um arquivo (equivalente a head -n 10 -)

sed '10q' -

4. Imprime a primeira linha em um arquivo (equivalente a cauda -1 -)

sed -n '1p' -

5. Exclua todas as instâncias de um caractere (equivalente a tr -delete '0' -, onde 0 é o caractere que queremos excluir)

sed -e 's / 0 // g' -

6. Converter arquivo csv em tsv (equivalente a tr ', "\ t' -)

sed -e 's /, / \ t / g' -

7.Anexar linha ao arquivo (equivalente a cat bar -)

sed '$ a ---' -

8. Anexar linha ao arquivo (equivalente a cat - bar)

sed '1i ---' -

9. Imprime todas as linhas do arquivo (equivalente a cat -)

sed -n -e 'p' -

10. Imprime linhas que correspondem a um padrão (equivalente a grep -e '^ 1' -)

sed -n -e '/ ^ 1 / p' -

11. Excluir linhas que correspondam a um padrão (equivalente a grep -v -e '^ 1' -)

sed -e '/ ^ 1 / d' -

12. Obtenha o número de linhas em um arquivo (equivalente a wc -l -)

sed -n -e '$ =' -

13. Grave em um arquivo em segundo plano (comando tee equivalente)

sed "w $ 1" -

Exemplo usando sed para implementar o comando tee

Acima, há um exemplo chamado Gravar em um arquivo no fundo. Soa como o comando tee. Bem é. Aqui iremos expandir sobre como implementar uma função para substituir tee em bash usando sed.

Comandos

tee ()

teste $ # -eq 1 || Retorna;
sed "w $ 1" -

a Principal ()

seq 10 | tee ten;
gato dez

a Principal

Resultado

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Aqui você verá duas listas de inteiros de 1 a 10. O primeiro é do comando seq. O segundo que obtemos do gato do arquivo escrito em tee. Eu sei que é ridículo mas funciona!

Exemplo usando sed para imprimir uma linha aleatória em um arquivo

Suponha que queremos imprimir uma linha aleatória em um arquivo usando bash e um pouco de sed. Nós podemos fazer isso? Sim, nós podemos! Aqui está como.

Implementar uma função que

  1. Obtém o número de linhas em um arquivo, L
  2. Gera um número aleatório entre 1 e L, R
  3. Imprime R

A função espera que a entrada seja canalizada de fora.

Comandos

alguma linha ()

função lc ()

sed -n -e '$ =' -
;
função print-line ()

sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
gato -> $ temp;
gato $ temp | linha de impressão $ ((RANDOM% $ (cat $ temp | lc) + 1));
rm $ temp

Exemplo de uso (1)

seq 100 | _

Produto (1)

35

Exemplo de uso (2)

curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags | alguma linha

Veja o exemplo abaixo, usando sed para remover as tags HTML. Observe que o exemplo acima às vezes retorna em branco para linhas vazias. Como exercício, pode ser melhorado.

Usando sed para imprimir linhas em um arquivo

Suponha que você deseja implementar uma função em bash para imprimir uma determinada linha em um arquivo. Tentar imprimir uma única linha em um arquivo usando um loop em bash, head, tail ou awk é muito trabalhoso para imprimir linhas em um arquivo. Que bom que temos sed. A função resultante usando sed seria a seguinte.

Comandos

print-line ()

sed -n "$ 1 p" -

Agora vamos ver o que acontece quando usamos a linha de impressão nas palavras.

Comandos

palavras | linha de impressão 50

Resultado

50

OK. Parece bom, mas vamos tentar algo que pareça um pouco menos trivial.

Comandos

declarar palavras -xf
declara -xf print-line
seq 1 10 $ (palavras | wc -l) | xargs -i bash -c "palavras | linha de impressão "

Resultado

1
11
21
31
41
51
61
71
81
91

OK. Agora isso é mais parecido com isso! Você vê como o sed pode ser usado em um script bash para imprimir qualquer linha em um arquivo.

Exemplos sed sem comandos equivalentes

Em um ambiente de linha de comando, às vezes o caminho para uma solução que produza menos resistência é o caminho sed; caso contrário, você acaba fazendo mais trabalho do que o necessário em primeiro lugar. Alguns comandos podem ser apresentados abaixo.

Comande todas as linhas em um script de shell

sed -e 's / ^ / # /' -
Apagar a primeira linha
sed -e '1d' -
Apagar a última linha
sed -e '$ d' -
Insira uma linha antes das linhas que correspondem a um padrão
sed '/ 0 $ / i ---' -
Insira uma linha após as linhas que combinem com um padrão
sed '/ 0 $ / ---' -
Retire as tags html
sed -e 's /<[^>] *.// g ' -
Atualize o ereg no código php antigo para rodar no php7 ou posterior
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Verifique se o sed é anterior a uma determinada versão
sed -e 'v 4.5 ' -

Exemplo de ramificação da versão do sed no bash

Acima nos exemplos, há uma linha para verificar se o sed é anterior a uma determinada versão que podemos usar para implementar ramificação de versão no bash, o que eu acredito ser mais fácil do que tentar implementar uma função para comparar os números de versão da saída do sed -version. Essa única armadilha é que se houver uma versão anterior do sed que não suporte o comando v, então estaremos em apuros.

Comandos

test-sed-version-at-most ()
echo -n | sed "v $ 1" - 2> / dev / null

try-version ()

echo -n "Versão $ 1. OK. Faça o ";
test-sed-version-at-most $ 1 &&
echo -n "antigo";
verdadeiro
||
echo -n "novo"
;
echo "caminho."

a Principal ()

local v;
para v em 4.4,5;
Faz
versão experimental $ v;
feito

a Principal

Resultado

Versão 4.4. OK. Faça do jeito antigo.
Versão 4.5. OK. Faça do novo jeito.

Observe que a versão do sed em execução na minha máquina ao digitar esses caracteres é 4.4, o que explicaria a saída acima. Além disso, ao mesmo tempo, a versão mais recente do gnu sed era 4.7, cerca de 3 anos mais velho do que o que eu tenho. Meu sed é velho! Na verdade, no sed 4.0.6, um parâmetro foi adicionado ao comando de versão para que esta estratégia funcione para qualquer, pelo menos, v4.0.6, que é tolerante, considerando que a versão foi lançada no início de 2003. Você é bom.

Eu fiz algumas pesquisas extras, na verdade, lendo o NEWS do código-fonte mais recente. Versão 4.6 tem um novo recurso, -debug, que despeja o script e anota as linhas de saída. Isto permitiria a você traduzir scripts sed gerados por funções em bash para a forma canônica. Frio! Só não se esqueça de que você precisa da ramificação da versão do sed no bash. É aí que este exemplo sed entra em jogo.

Exemplo de função bash usando sed para remover tags HTML

Nos exemplos acima, há uma linha para remover as tags HTML. Vamos jogar isso em uma função bash e usá-la para remover todas as tags HTML do último artigo que escrevi.

Comandos

strip-tags ()

sed -e 's /<[^>] *.// g ' -

curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags

Não posso dizer que seja perfeito, mas pelo menos é legível no terminal.

Exemplos de sed com fluxos de trabalho: Fluxo de trabalho de exemplo: substitua todos com segurança usando find, grep e sed

É seguro dizer que as alterações feitas usando sed com a opção -i são irreversíveis. A menos que você esteja completamente certo de qual texto deve ser substituído, é provável que você termine com um caractere a menos do que o pretendido. É por isso que, neste exemplo, usaremos o sed em um fluxo de trabalho para substituir o texto com segurança em todos os arquivos que você selecionou.

Fluxo de Trabalho

  1. achar
  2. grep
  3. sed
achar

Aqui você selecionará os arquivos sujeitos à substituição. Eu sugiro usar um comando com estas linhas:

find -tipo f -nome | grep -v -e | xargs -i…

Por exemplo, você pode querer limitar os arquivos para substituir os arquivos PHP, excluindo os diretórios do repositório git da seguinte forma.

find -tipo f -nome \ *.php | grep -v -e '.git '| xargs -i…

Leia mais sobre o comando xargs no bash.

grep

A seguir, vamos tentar encontrar algum_padrão nos arquivos selecionados da seguinte maneira. Observe que, uma vez que estamos usando a opção -o para grep, a saída mostrará apenas a string correspondente, se houver.

find -tipo f -nome \ *.php | grep -v -e '.git '|
xargs -i grep -e some_pattern -o

O comando acima deve retornar uma lista de strings que correspondem a algum_padrão.

sed

Por fim, queremos substituir todas as strings correspondentes a algum_padrão. Para fazer isso, precisamos converter grep em sed da seguinte forma.

find -type f -name \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / algum_ padrão / substituição / g

O comando grep torna-se sed -i e a opção -o é removida. E aí está.

Agora você pode verificar quais strings serão substituídas no sed de antemão em vez de testar sua sorte.

Notas finais sobre opções usadas em exemplos

Aqui está uma lista de opções usadas nos exemplos sed discutidos brevemente.

Opção Descrição
-eu Editar no local. Se a entrada for um arquivo (não canalizado), o resultado das expressões sobrescreverá o conteúdo do arquivo.

Sed aceita um

por exemplo) sed -n ..

-e -e significa expressão. Seu parâmetro é uma expressão na linguagem sed.

Sed aceita muitos

por exemplo) sed -e 'expr1' -e 'expr2' ..

-n Oculta a linha não afetada pela expressão. Ou seja, se a expressão for uma instrução de impressão na linguagem sed, as linhas não incluídas na instrução de impressão não serão incluídas na saída.

por exemplo) sed -n ..

Para obter mais informações sobre as opções disponíveis do sed, consulte sed -help

Notas finais sobre comandos equivalentes usados ​​em exemplos

Os seguintes utilitários de linha de comando estão incluídos nos exemplos sed com comandos equivalentes.

Nota final no final - em comandos equivalentes de exemplo

Caso você esteja se perguntando o que está acontecendo no caractere - no exemplo, esta nota é para você. Eu adicionei um caractere - após a maioria dos comandos nos exemplos para sugerir que esperamos que a entrada seja recebida por meio de um tubo. Isso é,

cat algum-arquivo | sort -R - | cabeça -1

No entanto, quando o comando à esquerda do tubo está presente, podemos omitir a dica da seguinte forma.

cat algum-arquivo | sort -R | cabeça -1

Isso é o que estava acontecendo com o caractere - após os comandos nos exemplos.

Notas finais sobre funções para configuração

Caso você esteja procurando, aqui estão as funções para configurar os exemplos acima. A saída obtida usando declare -f. Leia mais sobre o comando declare em bash para mais usos.

Comandos

palavras ()

seq 100

bar ()

eco ---

old-php ()

echo 'ereg ($ UA, "Bottybot")'

Resultado

Gostei de escrever exemplos do Bash sed e até aprendi alguns truques extras ao longo do caminho. Sed é um poderoso utilitário de linha de comando e linguagem expressiva para manipular arquivos de texto. Se você gostou de aprender sobre sed, não se preocupe, ainda há muito mais a ser tocado. Sed on.

Os 10 melhores jogos para jogar no Ubuntu
A plataforma Windows tem sido uma das plataformas dominantes para jogos devido à grande porcentagem de jogos que estão sendo desenvolvidos hoje para o...
5 melhores jogos de arcade para Linux
Hoje em dia, os computadores são máquinas sérias usadas para jogos. Se você não pode obter a nova pontuação máxima, você saberá o que quero dizer. Nes...
Batalha por Wesnoth 1.13.6 Desenvolvimento lançado
Batalha por Wesnoth 1.13.6 lançado no mês passado, é o sexto lançamento de desenvolvimento no 1.13.série x e oferece uma série de melhorias, principal...