adicionando strings no início do arquivo

1
$ ls *
2000-01-01-abcd.md
2000-01-01-cdef.md

Eu posso extrair abcd e cdef do seguinte comando

 find *.md -exec sh -c "echo {} | sed 's/.md//' | sed 's/2000-01-01-//'" \;

Eu sei como adicionar uma string no começo do arquivo via sed '1s/^/string/' , mas como eu passo a string exata?

Como eu passo essa string "abcd" e "cdef" nos arquivos correspondentes, porque eu quero adicionar as strings correspondentes em cada arquivo no começo do arquivo.

    
por infoclogged 10.09.2017 / 17:31

3 respostas

0

Descobri que isso é o mais próximo do que eu estava procurando. A idéia de um buffer tmp resolve o propósito. Outras soluções apontam para loops que, na minha opinião, já estão sendo atendidos pela combinação find -exec.

link

find ./ -name '*.md' -exec sh -c "echo '{}' | sed 's/.md//' | sed 's/2000-01-01-//' > tmp && cat {} >> tmp && mv tmp {}" \;
    
por 10.09.2017 / 19:15
1

to add the corresponding strings in each and every file in the beginning of the file

bash + abordagem sed :

for f in *.md; do fn=${f##*-}; sed -i "1 s/^/${fn%.*} /" "$f"; done
  • fn=${f##*-} - truncando a seqüência mais longa correspondida da esquerda até a última ocorrência de - (por ex. abcd.md )

  • ${fn%.*} - truncar a sequência mais à direita (do final) até a primeira ocorrência de . (ponto) da substring anterior fn (ou seja, abcd )

  • sed -i "1 s/^/${fn%.*} /" "$f" - adicione a string necessária ao início do arquivo

por 10.09.2017 / 17:43
0

Você precisa citar o *.md no seu comando find ou ele será expandido para nomes correspondentes quando você executá-lo. Você também nunca deve usar {} em um contexto entre aspas (veja, por exemplo, É possível usar 'find -exec sh -c' com segurança? ).

Aqui está uma solução de loop de shell:

for name in ./*.md; do
    prefix="${name%.md}"             # "./2000-01-01-abcd.md" --> "./2000-01-01-abcd"
    prefix="${prefix##*-}"           # "./2000-01-01-abcd"    --> "abcd"

    { echo "$prefix"; cat "$name"; } >"$name".tmp && mv "$name".tmp "$name"
done

A mesma coisa com find :

find . -type f -maxdepth 1 -name "*.md" \
    -exec sh -c 'p="${1%.md}";p="${p##*-}";{ echo "$p";cat "$1"; }>"$1".tmp && mv "$1".tmp "$1"' sh {} ';'
    
por 10.09.2017 / 17:45

Tags