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
w
escreva o arquivo
q
saia do editor
Esses comandos são enviados por ed
meio de umaqui documento, indicado pelo << EOF
. A EOF
string é um nome semiarbitrário emparelhado com as outras EOF
quatro linhas abaixo. Deixar EOF
sem aspas significa que quaisquer variáveis nas linhas intermediárias serão expandidas.
A outra coisa a notar aqui é o unquoted $1
. O ed
comando/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 pesquisad
exclua a linha
Então a próxima linha w
escreve as alterações e q
sai ed
.
Efeito
Se a linha um do arquivo ( $1
) estiver vazia ou tiver apenas espaços (sem tabulações), ele será removido.