Ajuda para mesclar dois códigos num script shell

Olá amigos pinguins, recentemente comecei a desenvolver este script em shell (que usa regex do perl dentro, mas eu vou trocar isso depois) que imprime um arquivo markdown de forma legível (como se o markdown já não fosse legível o suficiente) no terminal linux (tipo o glow), vocês podem ver mais detalhes ou comentar neste post que eu fiz no reddit. Meu esforço atual está concentrado em fazer com que as tabelas markdown apareçam corretamente. Sei que meu código ainda está feio e difícil de entender, mas gostaria de pedir ajuda em uma dúvida de noob: eu consegui criar um código que funciona do jeito que eu quero quando está em um script isolado, mas não consigo fazê-lo funcionar junto com o script que já tenho (o script está aqui), e o código que eu fiz para formatar as tabelas é esse:

numOFmatches=0
currenttable=""
tablesize=0

FILE=$(cat "$FILE" | while IFS= read -r line; do
  if [[ $line =~ ^\| ]]; then
    ((numOFmatches++))
    currenttable+=" $line\n"
  else
    if [ $numOFmatches -gt 0 ]; then
      table=$(echo -e "$currenttable" | awk 'NR==1{gsub(/-/,"="); print toupper($0)} NR!=1{print $0}')
      header=$(echo -e "${table}" | head -1)
      data=$(echo -e "${table}" | tail -n +2)
      echo -e "\x1b[1m${header}\x1b[0m" | column -t -s '|'
      echo -e "${data}" | column -t -s '|'
      echo
      for ((i=0; i<$tablesize; i++)); do
        echo
      done
      numOFmatches=0
      currenttable=""
    fi
    echo "$line"
  fi
done < "$FILE"

if [ $numOFmatches -gt 0 ]; then
  table=$(echo -e "$currenttable" | awk 'NR==1{gsub(/-/,"="); print toupper($0)} NR!=1{print $0}')
  header=$(echo -e "${table}" | head -1)
  data=$(echo -e "${table}" | tail -n +2)
  echo -e "\x1b[1m${header}\x1b[0m" | column -t -s '|'
  echo -e "${data}" | column -t -s '|'
  echo
  for ((i=0; i<$tablesize; i++)); do
    echo
  done
fi)

echo "$FILE"

Isso pega o conteúdo de $FILE (que é o conteúdo do arquivo escolhido como parâmetro no script), trata as tabelas e as armazena de volta na variável, depois imprime, como eu disse antes ele exibe tudo do jeito que eu quero quando colocado em um script separado, mas não quando tento incorporá-lo no resto do programa (tentei de várias maneiras), mas a saída do script não é alterada e eu não consigo descobrir o que eu estou fazendo de errado.

Por curiosidade, ele deixa as tabelas assim:
Captura de imagem_20240618_005603

Alguém aqui com experiencia em shellscript poderia dar um help por favor? Eu tô quase queimando meu último neurônio tentando fazer isso mas não saí do lugar.
Desde já agradeço à todo pela atenção.

Cara, primeira coisa q vou te perguntar é se tu já pediu socorro pro chat gpt?
Ele funciona mt bem pra coisas desse tipo

A segunda dica ia ser tentar linkar da seguinte forma

vc pode fazer de algumas formas, mas eu faria assim (gambiarra braba)
salva um .txt usando o codigo q vc quer implementar o .sh dentro

cada linha coloca um dos valores q vc vai usar

executa o .sh por dentro da linguagem, praticamente todas conseguem executar comandos de terminal, ent execute um comando bash dentro da linguagem

dentro do .sh delete o .txt apos ler o arquivo
devolva oq vc quiser em outro arquivo diferente
ex: tabela markdown cria um temp.md com ela dentro

abre no seu codigo principal, copia e deleta o arquivo temporario

1 curtida

Como você chama esse script? Como você não deu detalhes vou ser generalista, você vai usar duas funções

function MarCLIdown () {
  # Cole aqui o código do MarCLIdown
}

function processaTabela() {
  # Cole seu código aqui
}

MarCLIdown ${@}
processaTabela

O único ponto de atenção é um erro de lógica no seu script, você tem cat "$FILE" e < "$FILE" os dois não só são conflitantes como $FILE recebe o conteúdo do arquivo em MarCLIdown e não o nome (bad pattern) enquanto seu script espera que $FILE receba o nome do arquivo esse é o ponto de conflito inclusive, pra resolver é bem simples:

Troque:

FILE=$(cat "$FILE" | while IFS= read -r line; do

Por

FILE=$(while IFS= read -r line; do

e

done < "$FILE"

Por

done <<< "$FILE"

Só isso basta para os dois serem compatíveis, porém nos meus testes MarCLIdown não funciona com blocos de código corretamente

1 curtida

Valeu mano deu certo, eu tinha até esquecido que perguntei aqui… kkk

E os blocos de código não tão bons ainda não, eu ia implementar isso depois de terminar as tabelas, acabei que fui mexer em outras partes do código…
Já tenho uma ideia de como fazer isso usando caracteres de escape…

1 curtida

Este tópico foi fechado automaticamente 3 dias depois da última resposta. Novas respostas não são mais permitidas.