Ótimo! Agora eu aprendi algo novo. Eu usei sed
para todos os tipos de substituições (menores), e não percebi que você pode realmente programar nele. Obviamente, uma "máquina" bastante fraca, já que tem apenas dois registros e uma linguagem bastante obscura.
Como sed
não usa variáveis de entrada, estou com um script sh
que invoca sed
com um programa dinâmico, que é preparado substituindo BLOCK e ENTRY pelas tags reais da linha de comando . Essa substituição é feita com uma simples substituição sed
simples para preparar o programa específico para obter a inserção da entrada.
O script a seguir parece fazer o trabalho. Se chamado addentry
, ele seria chamado como
$ addentry LETTER SAMPLE < data
para reproduzir os dados de entrada com a entrada inserida como sua saída. Suponho que exista uma opção -i
para sed
para "edição no local", se for necessário.
#!/bin/sh
/bin/sed -n "$(cat << EOF | sed -e "s/BLOCK/$1/g;s/ENTRY/$2/g"
# Initialize hold space with 0
1 { x ; /^$/ s/^$/0/; x }
# Lines outside the interesting block are just printed
/\s*serverClass:BLOCK/,/^$/! { p }
# Lines of the interesting block are considered more in detail
/\s*serverClass:BLOCK/,/^$/ {
# The final empty line is replaced by the new entry, using the line
# counter from the "hold buffer"
/^$/ { g; s/\(.*\)/whitelist.=ENTRY/p; s/.*//p; b xx }
# print the line
p
# Jump forward for the block leader (note xx is a label)
/serverClass:/ { b xx }
# Increment hold space counter
# (Only handles 0-9 here; room for improvement)
x; y/0123456789/1234567890/; h
# If the block ends the file without blank line, then add the
# new entry at end.
$ { g; s/\(.*\)/whitelist.=ENTRY/p; b xx }
# Label xx is here
:xx
}
EOF
)"
Muito obrigado por levantar esse (para mim) desafio interessante.