На этот вопрос уже есть ответ здесь:
Входной файл:
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".
Можно использовать следующий 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
Здесь Вы - решение для удара:
#!/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
Сценарий ниже предполагает, что числа в словах происходят последовательно в именах файлов (например. 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())
add_one.py
Выполните его с файлом как аргумент командой:
python3 /path/to/add_one.py '</path/to/file>`
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