Поиск и замена числовой части конкретной строки увеличенным значением с помощью команды терминала [дубликат ]

На этот вопрос уже есть ответ здесь:

Входной файл:

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

Мне нужен выходной файл как

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

т.е. числовая строка, связанная с тестом , увеличивается на единицу. Для выполнения этой операции мне нужна подходящая командная строка терминала.

В частности, мне нужно знать механизм преобразования "test09.dat" в "test10.dat".

3
задан 30 March 2015 в 12:59

4 ответа

Можно использовать следующий perl острота, чтобы сделать преобразование:

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

Результат:

test01.dat test10.dat aram22.dat

Для использования входного файла:

$ perl -pe 's/test\K(\d+)/sprintf "%02d", $1+1/eg' your_file
test01.dat test08.dat test04.dat
aram22.dat test10.dat aram09.dat
test14.dat
2
ответ дан 30 March 2015 в 12:59

Здесь Вы - решение для удара:

#!/bin/bash

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

names=$(cat "$1" | 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
0
ответ дан 30 March 2015 в 12:59

Сценарий ниже предполагает, что числа в словах происходят последовательно в именах файлов (например. file_123.dat, нет file12something345.dat), и названия файлов уникальны.

Что это делает

  • Это ищет файл слова с целыми числами на имя.
  • Это преобразует те (последовательные) целые числа международные "реальные" целые числа (значения), которые удалят начальные нули.
  • Добавьте тот к значению
  • Затем сравните "исходную" длину числовой строки с отредактированным значением, добавив начальные нули, если отредактированная строка короче.

Пример:

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

выводы:

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

Сценарий

#!/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())

Как использовать

  1. Скопируйте его в пустой файл, сохраните его как add_one.py
  2. Выполните его с файлом как аргумент командой:

    python3 /path/to/add_one.py '</path/to/file>`
    
0
ответ дан 30 March 2015 в 12:59

quick'n'dirty решение на основе , Как найти и заменить конкретную строку путем увеличения ее числовой части? (предложенный KasiyA)

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

Примечание, что существует ужасный взлом в моей команде: выводы жемчуга test1.dat и я использую sed для фиксации его к test01.dat

0
ответ дан 30 March 2015 в 12:59

Другие вопросы по тегам:

Похожие вопросы: