Encontre e substitua a parte numérica de uma string particular por um valor aumentado usando o comando terminal [duplicate]

3

O arquivo de entrada é

test00.dat test07.dat test03.dat
aram22.dat test09.dat aram09.dat
test13.dat

Eu preciso do arquivo de saída como

test01.dat test08.dat test04.dat
aram22.dat test10.dat aram09.dat
test14.dat

i.e. a cadeia numérica associada a test é aumentada pela unidade. Eu preciso de um terminal adequado para executar esta operação.

Especialmente, preciso saber o mecanismo de conversão de 'test09.dat' para 'test10.dat'.

    
por tamal 30.03.2015 / 10:06

4 respostas

2

Você pode usar o seguinte perl oneliner para fazer a transformação:

echo "test00.dat test09.dat aram22.dat" | perl -pe 's/test\K(\d+)/sprintf "%02d", +1/eg'

Resultado:

test01.dat test10.dat aram22.dat

Para usar seu arquivo de entrada:

$ perl -pe 's/test\K(\d+)/sprintf "%02d", +1/eg' your_file
test01.dat test08.dat test04.dat
aram22.dat test10.dat aram09.dat
test14.dat
    
por Sylvain Pineau 30.03.2015 / 11:54
0

Uma solução rápida e sem precedentes baseada em Como encontrar e substituir uma string específica aumentando sua parte numérica? (sugerido por KasiyA)

echo "test00.dat test07.dat aram22.dat" | perl -pe 's/(?<=test)(\d+)/+1/eg' | sed -e 's/test\([0-9]\)\./test0/g'
test01dat test08dat aram22.dat

Note que há um hack feio no meu comando: perl gera test1.dat e eu uso sed para corrigi-lo para test01.dat

    
por ndemou 30.03.2015 / 11:20
0

Aqui você é uma solução bash:

#!/bin/bash

if [ ! -f "" ]; then
    echo "File not found!"
    exit
fi

names=$(cat "" | sort)

for i in $names; do
    filename=${i%.*}
    extension=${i##*.}
    number=${filename: -2:2}
    name=${filename//[0-9]}
    fnumber=$(printf "%02d\n" $((${number#0}+1)))
    if [[ "$name" == "test" ]]; then
        echo "${name}${fnumber}.${extension}"
    else
        echo "$i"
    fi    
done
    
por Helio 30.03.2015 / 12:01
0

O script abaixo assume que os números nas palavras ocorrem consecutivamente nos nomes dos arquivos (por exemplo, file_123.dat , não file12something345.dat ), e os nomes dos arquivos são exclusivos .

O que faz

  • Pesquise no arquivo por palavras com números inteiros no nome.
  • Ele converterá esses inteiros (consecutivos) em inteiros (reais) "reais", os quais removerão os zeros à esquerda.
  • Adicione um ao valor
  • Em seguida, compare o tamanho "original" da string numérica com o valor editado, adicionando zeros à esquerda se a string editada for mais curta.

Exemplo:

test999.dat test07.dat test03.dat
aram22.dat test09.dat aram09.dat
test0000013.dat

saídas:

test1000.dat test08.dat test04.dat
aram22.dat test10.dat aram09.dat
test0000014.dat

O script

#!/usr/bin/env python3
import sys

file = open(sys.argv[1]).read()
for w in [w for w in file.split() if w.startswith("test")]:
    try:
        found = "".join([ch for ch in w if ch.isdigit()])
        replace = (len(found), str(int(found)+1))
        file = file.replace(w, w.replace(found, replace[1].zfill(replace[0])))
    except ValueError:
        pass
print(file.strip())

Como usar

  1. Copie-o em um arquivo vazio, salve-o como add_one.py
  2. Execute-o com o arquivo como um argumento pelo comando:

    python3 /path/to/add_one.py '</path/to/file>'
    
por Jacob Vlijm 30.03.2015 / 11:53