Wie finde und ersetze ich eine Zeichenkette durch Erhöhen ihres numerischen Teils?


3

Meine Eingabedatei ist,

ami21 ami65
ami67 ami66
ami88 ami76 ami29
ami55 
ami54
ami32

Mit einer einzigen Befehlszeile brauche ich die Ausgabe als,

ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56
ami55
ami33

Ich habe den Befehl verwendet

awk -vRS=ami '{$0=$0+1;ORS=RT}++n' inputfile > outputfile

aber ich habe die ausgabedatei als ami21ami65ami67ami66ami88ami76ami29ami55ami54ami32

dh alle Zeichenfolgen werden in derselben Zeile und ohne Leerzeichen geschrieben. Könnte mir jemand eine bessere Kommandozeile empfehlen.


Antworten:


5

perlDies könnte einfacher sein :

$ perl -pe 's/(\d+)/$1+1/eg' foo
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33
  • -pe: Durchlaufen Sie die Datei zeilenweise und drucken Sie jede Zeile nach der Auswertung des Ausdrucks
  • s/(\d+)/$1+1/e: Ordne eine Zahl ( \d+) zu und ersetze sie durch ihr Inkrement ( $1+1), mit edem Perl angewiesen wird, die Ersetzung zu bewerten.

Mit awkmüssen Sie das Leerzeichen in das Datensatztrennzeichen aufnehmen:

$ awk -v RS='[[:space:]]*ami[[:space:]]*' '$0{$0++;}{ORS=RT}1' foo
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33

2
Ich wollte den gleichen Perl-Code vorschlagen :). Sie müssen / g zu Ihrem regulären Ausdruck hinzufügen, da nur die erste Übereinstimmung inkrementiert wird.
Sylvain Pineau

2

Abgesehen von der hervorragenden Antwort von "muru", wenn Sie etwas anderes ausprobieren möchten, gibt es hier einen pythonischen Weg:

#!/usr/bin/env python2
import re
with open('file_name.txt') as f:
    for line in f:
        final_list = ['ami' + str(int(value) + 1) for value in re.findall('\d+', line)]
        print ' '.join(final_list)

1

Eine weitere Python-Lösung durch re.sub.

$ python3 -c 'import re, sys
with open(sys.argv[1]) as f:
    for line in f:
        print(re.sub(r"\d+", lambda x: str(int(x.group())+1), line), end="")' file
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.