Encontre e substitua em uma pasta de .txt (mas apenas as primeiras 1-3 linhas)

2

Eu tenho uma pasta de arquivos .txt. Todos eles se parecem com isso:

Title: Title of blog post.
Tags: tag1,tag2,tag3

Text on the post. Just my thoughts. 

> A blockqoute

Written in *markdown.* Using <http://scriptogr.am/>

Nothing really scary.

Digamos que eu queira alterar o nome tag1 para tagOne por algum motivo. É possível executar algum tipo de grep ou localizar & substituir nestes txt dentro da minha pasta?

Bônus se eu puder realizar a pesquisa e substituir somente as primeiras 1 a 3 linhas, pois posso escrever a palavra "tag1" no corpo da postagem do meu blog, mas não desejo alterá-la aqui.

Estou no Windows 7. Mas tenha acesso a uma máquina Kubuntu (se isso fizer alguma diferença).

    
por user1603548 12.07.2014 / 19:18

3 respostas

3

A maneira mais fácil de fazer isso é na sua máquina GNU / Linux usando sed(1) . Supondo que apenas os arquivos de texto que você deseja transformar estejam no diretório:

$ for a in /path/to/directory/*txt; do sed -i '1,3{s/tag1/tagOne/g;}' "${a}"; done

O que isso faz, explicado com mais detalhes:

  • Há um loop para iterar os arquivos com os quais você deseja trabalhar:

    for a in [...]; do [...]; done
    
  • Para cada iteração, a variável a manterá o nome de um arquivo correspondente ao padrão de globbing /path/to/directory/*txt .

  • Quando soubermos com que arquivo estamos trabalhando, vamos do algo com ele, neste caso, um comando sed :

    sed -i '1,3{s/tag1/tagOne/g;}'
    
  • O sinal -i significa in place , portanto, o comando sed não precisará gravar arquivos temporários. Em seguida, 1,3 define o intervalo de linhas em que o comando sed irá operar. As chaves são o operador de agrupamento, que significa "da linha 1 a 3, execute o comando interno". Esse comando é s : replace. O comando replace aceita uma expressão regular para correspondência e uma sequência para substituir essa correspondência por, neste caso, você deseja substituir tag1 por tagOne . O comando termina com o modificador g , que significa global .

Em inglês, todo o comando diz:

For every file in the designated directory, whose name ends with txt, replace in it, but only in the lines one to three, all the occurrences of tag1 with tagOne.

    
por 12.07.2014 / 20:46
1

Você pode usar o Vim no modo Ex:

for k in *.txt
do
  ex -sc '1s/tag1/tagOne/3|x' "$k"
done
  1. 1 passar para a primeira linha

  2. 3 selecione 3 linhas

  3. s substituto

  4. x salvar e fechar

por 17.04.2016 / 00:16
0

Isso pode ser feito no notepad ++ quando você clica

ctrl+shift+F
O comando

é chamado Localizar nos arquivos.

Não realiza as "primeiras três linhas". Uma solução alternativa para isso pode ser nomear minhas tags @ tag1 ou # tag1 ou & tag1 para começar.

    
por 14.07.2014 / 01:14