web-dev-qa-db-ja.com

ターミナルコマンドを使用して、特定の文字列の数値部分を検索して値を増やして置き換えます

入力ファイルは、

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

つまり、testに関連付けられた数値文字列が1ずつ増加します。この操作を実行するには、適切な端末コマンドラインが必要です。

特に、「test09.dat」から「test10.dat」への変換メカニズムを変更する必要があります。

3
tamal

次のPerl onelinerを使用して、変換を行うことができます。

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
Sylvain Pineau

数値部分を増やして特定の文字列を見つけて置換する方法 (KasiyAが提案)に基づいたquick'n'dirtyソリューション

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

コマンドにいハックがあることに注意してください。Perlはtest1.datを出力し、sedを使用してtest01.datに修正します。

0
ndemou

以下のスクリプトは、単語内の数字がファイル名(例えばfile_123.datではなくfile12something345.dat)に連続して出現すると仮定し、ファイルの名前はuniqueです。

何をする

  • 名前に整数を含む単語のファイルを検索します。
  • これらの(連続した)整数を「実際の」整数(値)に変換し、先行ゼロを削除します。
  • 値に1を追加します
  • 次に、数値文字列の「元の」長さと編集された値を比較し、編集された文字列が短い場合は先行ゼロを追加します。

例:

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
Jacob Vlijm

これがbashソリューションです:

#!/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
Helio