Estou tentando substituir >>>
por "" no arquivo
cat table_files.md | egrep ">>>$"
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
\>>>
substitua-o por sed
cat table_files.md | sed "s\>>>$\\g" > table_files.md
Infelizmente, todos os meus dados desapareceram, ele me devolveu um arquivo em branco. Eu verifico que isso deve ser feito usando -i
a opção no lugar.
Como isso pode acontecer, é possível recuperar os dados?
O MOTIVO pelo qual o arquivo foi substituído/truncado foi que é o seu shell que interpreta os redirecionamentos e faz essa interpretação antes que qualquer comando seja executado. Uma grande parte do trabalho do shell é lidar com o encanamento para conectar stdin e stdout entre várias coisas. Você emitiu uma linha de comando como:
Mesmo antes
command2
de ser executado, o shell havia interpretado o redirecionamento que direcionaria a saída desse comando para um arquivo, truncando o arquivo. E com o arquivo truncado, não havia entrada paracommand1
ler, e assim saiu, fechando o pipe paracommand2
, que também saiu, sem ter emitido nenhum dado para ser redirecionado para o arquivo.Parece que você tem duas perguntas aqui...
1. Posso recuperar o arquivo que sobrescrevi?
Provavelmente não. Se você puder, isso será feito restaurando um backup. A substituição de um arquivo por outros dados geralmente elimina a versão antiga do arquivo.
2. Qual é a melhor maneira de substituir dados em um arquivo?
Como você supôs, a melhor maneira de fazer isso com o sed seria usar a
-i
opção (inplace). Tenha em mente que esta não é realmente uma edição no local. A-i
opção faz com que o sed leia toda a sua entrada, modifique-a e armazene-a em um armazenamento temporário e, após a conclusão, mova tudo do armazenamento temporário de volta para o arquivo original.No BSD sed (incluindo macOS):
Mas no GNU sed (a maioria das distribuições Linux), uma opção não especificada
-i
é considerada nula:Isso remove as
>>>
extremidades das linhas. Se você deseja remover a string de dentro das linhas, modifique o regex para que não fique ancorado no final da linha ($
) e adicione og
sinalizador para que ele se aplique a várias strings por linha:Observe que diferentes sistemas operacionais executam o sed de maneiras diferentes. Ao escrever ferramentas que você deseja compartilhar, é importante lembrar que nem todos executam o mesmo sistema operacional que você. A portabilidade é importante. Para tornar as coisas portáteis, você pode ter que simplificar seus scripts para que eles usem o "menor denominador comum" de funcionalidade disponível em todas as plataformas às quais você deseja oferecer suporte. Desta forma: