Coloque todos os comandos sed em um arquivo de script de shell

3

Essencialmente, eu recebo um arquivo de texto e devo foder com ele via comandos sed. Eu tenho cerca de 7 comandos sed totais e preciso colocá-los todos em um script de shell para produzir uma saída quando este script é executado.

Arquivo de texto a ser parafusado: students.txt

Students.txt:

DogG DOGGGGGGGG
dog dog dog Jamesb
JamesBrady
derghnregnrig
JamesBeody

Portanto, o primeiro sed elimina a primeira e a última linha. segundo sed substitui cão por DOGGGG terceiro sed encontra e imprime todas as linhas w / JamesBrady Quarta sed encontra e imprime todas as linhas com derghnregnrig

Comandos Sed (Exemplos de BS):

sed -e '1d' -e '$d' -e '/^$/d' students.txt
sed -n s/dog/DOGGGG/g students.txt
sed -n /JamesBrady/p students.txt
sed -n /derghnregnrig/p students.txt

Os comandos sed acima são todos para ir em um arquivo de script de shell, e quando a execução deve produzir seus efeitos (cumulativos?) em um arquivo de texto (students.txt)

Até agora, tentei procurar o procedimento correto para fazer isso e não encontrei nada além de confusão. Alguém pode explicar com clareza e com a paciência de um iniciante como múltiplos comandos sed e quaisquer comandos (awk, grep, etc.) para esse assunto, devem caber dentro de um único arquivo de script de shell?

Usando o Ubuntu 16.04, Vim. Bash shell

    
por KMoy 11.10.2016 / 08:42

3 respostas

7

Eu suponho que você realmente quer ver a linha com DOGGGG desde que você está editando (caso contrário, por que se incomodar?)

Use {} para agrupar comandos em um bloco ...

sed -n '{
       1d
       $d
       /^$/d
       s/dog/DOGGGG/g
       /DOGGGG/p
       /JamesBrady/p
       /derghnregnrig/p
}' students.txt

resultado:

  DOGGGG DOGGGG DOGGGG Jamesb
  JamesBrady
  derghnregnrig

Você não precisa de tudo isso para o seu exemplo ...

sed -n '{
       1d
       $d
       s/dog/DOGGGG/g;p
}' students.txt

mas eu acho que seu arquivo real realmente tem linhas vazias e coisas no meio que você não quer imprimir.

    
por Zanna 11.10.2016 / 09:32
3

Primeiro, verifique esses comandos sed, eles podem não estar fazendo o que você quer. Por exemplo, o segundo, em vez de

sed -n s/dog/DOGGGG/g students.txt

Eu acho que deveria ser

sed -i 's/dog/DOGGGG/g' students.txt

Leia man sed e verifique se eles funcionam individualmente antes de criar seu script.

Crie um novo arquivo (por exemplo, nano yourscript.sh) e escreva #!/bin/bash seguido pelos seus comandos sed, substituindo students.txt por . Este representa o primeiro argumento quando você chama o script:

#!/bin/bash
sed -e '1d' -e '$d' -e '/^$/d' 
sed -n s/dog/DOGGGG/g 
sed -n /JamesBrady/p 
sed -n /derghnregnrig/p 

Com os comandos sed corretos. Agora, dê as permissões de execução de script:

sudo chmod 755 yourscript.sh

E execute-o com o nome do arquivo como primeiro argumento:

sudo ./yourscript.sh students.txt

Você só precisa do sudo neste último comando se o usuário não tiver permissão para alterar o arquivo students.txt.

    
por Katu 11.10.2016 / 09:23
0

Opção 1: coloque cada comando sed em seu script de shell em uma linha separada e faça com que eles operem no local usando a opção -i .

Opção 2: use uma única linha de comando sed em seu script de shell, mas passe cada expressão usando uma opção -e separada.

A opção 2 é preferida se suas expressões forem ortogonais (isto é, elas não operam nas mesmas correspondências).

    
por Stephen M. Webb 11.10.2016 / 15:05