comando ed: Excluir da linha 1 até a primeira linha em branco

comando ed: Excluir da linha 1 até a primeira linha em branco

Encontrei esse código em um livro didático; o livro diz apenas que 1,/^[ ]*$/d significa “Excluir da linha 1 até a primeira linha em branco”. O que cada personagem significa especificamente?

ed $1 << EOF
    1,/^[ ]*$/d
    w
    q
EOF

Responder1

1,/.../significa o intervalo da 1ª linha até uma linha que corresponde ao padrão entre /.

/^[ ]*$/corresponde a uma linha que contém 0 ou qualquer número de espaços [ ]*do início ^ao fim $da linha.
Não está claro se o código da pergunta é intencional e se é uma cópia exata do livro. Não são necessários colchetes em torno de um único espaço. Talvez o autor original quisesse ter um espaço e um caractere de tabulação entre colchetes, que poderiam ser substituídos pelo caractere class [[:blank:]].

dé o comando para deletar a linha

wescreva o arquivo

qsaia do editor

Esses comandos são enviados por edmeio de umaqui documento, indicado pelo << EOF. A EOFstring é um nome semiarbitrário emparelhado com as outras EOFquatro linhas abaixo. Deixar EOFsem aspas significa que quaisquer variáveis ​​nas linhas intermediárias serão expandidas.

A outra coisa a notar aqui é o unquoted $1. O edcomando/script será executado no primeiro parâmetro posicional (argumento para o script ou função)sujeito a mais divisão de espaços em branco e geração de nome de arquivo. O argumento realmente deveria ser citado. Para leitura adicional, consultePor que meu script de shell engasga com espaços em branco ou outros caracteres especiais?eImplicações de segurança de esquecer de citar uma variável em shells bash/POSIX.

Responder2

Comando e entrada

O $1é o nome do arquivo a ser editado e tudo entre os EOFs são comandos para ed.

Descrição golpe por golpe de1,/^[ ]*$/d

  • 1,começar da linha1 e neste caso continue até a primeira ocorrência da string de pesquisa
  • /indica que estamos prestes a procurar uma string
  • ^indica que queremos corresponder ao início da linha no arquivo
  • [indica que estamos prestes a especificar muitos caracteres
  • ' 'queremos corresponder a um espaço - normalmente haveria mais caracteres aqui
  • ]terminei de especificar caracteres
  • *queremos combinar 0 ou mais espaços (ou quaisquer caracteres entre [])
  • $até o final da linha no arquivo
  • /fechando a pesquisa
  • dexclua a linha

Então a próxima linha wescreve as alterações e qsai ed.

Efeito

Se a linha um do arquivo ( $1) estiver vazia ou tiver apenas espaços (sem tabulações), ele será removido.

informação relacionada