sed/awk oder anderen: one-liner, die zum Inkrementieren einer Zahl von 1 halten Sie Abstand Zeichen
BEARBEITEN: ich weiß nicht im Voraus, auf die "Spalte" meine Ziffern sind dabei, und ich hätte auch gern einen one-liner. Anscheinend sed nicht rechnen, also vielleicht eine Einzeiler-Lösung auf Basis der awk?
Ich habe einen string: (beachten Sie den Abstand)
eh oh 37
und ich möchte es werden:
eh oh 36
(so will ich weiterhin Abstand)
Mit awk ich nicht finden, wie es zu tun, so weit ich habe:
echo "eh oh 37" | awk '$3>=0&&$3<=99 {$3-- } {print}'
Aber das gibt:
eh oh 36
(der Abstand Zeichen, wo verloren, weil das Feld-Trennzeichen ' ')
Gibt es eine Möglichkeit, Sie zu Fragen awk etwas wie "drucken" die Ausgabe mit der exakt gleichen Feld-Separatoren, als die Eingabe hatte"?
Dann habe ich versucht, noch etwas anderes, mit awk ist sub(..,..) Methode:
' sub(/[0-9][0-9]/, ...) {print}'
aber keine Zigarre noch: ich weiß nicht, wie auf der regexp und rechnen auf es im zweiten argument (das ich Links mit " ... " für jetzt).
Dann habe ich versucht mit sed, aber hängengeblieben ist nach diesem:
echo "eh oh 37" | sed -e 's/\([0-9][0-9]\)/.../'
Kann ich rechnen von sed mit einer Referenz auf die übereinstimmenden Ziffern und die Ausgabe nicht ändern, die Anzahl der Abstände Zeichen?
Beachten Sie, dass es in Bezug auf meine Frage bezüglich Emacs und wie Sie dies für einige (große) Emacs-region (mit einem replace-region-mit Emacs ist shell-command-on-region), aber es ist nicht eine identische Frage: diese ist speziell über, wie "Räume" beim arbeiten mit awk/sed/etc.
split
geben Sie die Trennzeichen als auch die Felder.Sie verwalten können diese in awk durch die völlig ignoriert die Feld-Aufteilung, und nur tun, einige regex-Sachen auf
$0
, aber es ist irgendwie unelegant. Ist perl eine option?sicher, Perl ist eine option... Aber ich bin interessiert in die fugly awk-version auch 🙂
InformationsquelleAutor SyntaxT3rr0r | 2010-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine variation auf ghostdog74 ist Antwort, die nicht erfordert, die Anzahl verankert werden, die am Ende der Zeichenfolge. Dies wird durch die Verwendung
match
anstatt sich auf die Anzahl in einer bestimmten position.Diese wird, ersetzen Sie die erste Zahl mit dem Wert minus eins:
Mit
gsub
gibt es stattsub
ersetzen würden sowohl die "37" und die "22" mit "36". Wenn es nur eine Zahl auf der Linie, ist es egal, welche Sie verwenden. By doing es auf diese Weise, obwohl, es behandelt zahlen mit Leerzeichen und andere nicht-numerische Zeichen, dass sich dort möglicherweise (nach ein paar Leerzeichen).Wenn Sie
gawk
verwenden, können Siegensub
wie das herausgreifen einer beliebigen Anzahl innerhalb der Zeichenfolge (nur den Wert deswhich
):Zweiten (
which=2
) Anzahl ging von 22 auf 21. Und der eingebettete Leerzeichen werden beibehalten.Es ist aufgeteilt in mehrere Zeilen um es einfacher zu Lesen, aber es ' s copy/pastable.
InformationsquelleAutor Dennis Williamson
oder
InformationsquelleAutor ghostdog74
etwas wie
Ja, die sed nicht rechnen.
vielen Dank 🙂
InformationsquelleAutor Paul Creasey
Wie etwa:
InformationsquelleAutor marco
Die Lösung wird nicht beibehalten die Anzahl der Dezimalstellen ein, also wenn die Zahl 10, dann ist das Ergebnis 9 ist, auch wenn man gerne hätte, 09.
Ich nicht schreiben der kürzest möglichen code, das sollte es auch bleiben lesbar
Hier Baue ich die printf-Muster mit RLENGTH es wird also %02d Absatz 2 wird die Länge der übereinstimmenden Muster)
InformationsquelleAutor Gunstick