Zeilen unterhalb bestimmter bearbeiten

0

Ich muss die Zeile unter einer bestimmten Zeile mit einem bestimmten Text bearbeiten. Ich bearbeite eine TXT-Datei mit .bat oder .vbs in Windows 8.

Beispiel

Account 1
ABC  -         Debit    900
     -         Credit   900
DEF  -         Debit    800
     -         Credit   100

Ich möchte, dass die Ausgabe so ist

Account 1
ABC  -         Debit    900
ABC  -         Credit   900
DEF  -         Debit    800
DEF  -         Credit   100
Aj Santos
quelle
Ich finde, dass dieser reguläre Ausdruck hilft (siehe den Abschnitt find hier). I.imgur.com/sEihzzi.png find ([A-Za-z]*)(\s+-[^\r\n]*\r\n)([\s]*)- replace mit $1$2$1-einem Befehl wie perl oder ack könnte vielleicht verwendet werden. ZB ein Tool, das neue Zeilen lesen und einen regulären Ausdruck anwenden kann in eine Textdatei.
Barlop
Wenn möglich, möchte ich es in einer Batch-Datei tun
Aj Santos
Das Problem mit verallgemeinerten Beispielen ist, dass sie nicht immer der realen Welt entsprechen. Gibt es immer einen Bindestrich auf Position 6? Sie können den letzten führenden Wert speichern und einfügen, falls keiner vorhanden ist.
LotPings
@LotPings Und das Problem mit einem nicht verallgemeinerten Beispiel ist, dass es viel komplexer als nötig ist und dass dies keine Hausaufgabenstelle ist, sodass er zu Recht fragt, was er gefragt hat. Kein Zweifel, wenn du ihm antworten kannst, wie es geht, würde das seine Frage beantworten, die das Ziel sein soll. Und Fragen sind oft auch für andere nützlich, was ein weiterer Grund ist, warum nicht zu spezifisch, wenn möglich, bevorzugt wird.
Barlop
@ AjSantos benötigen Sie ein Befehlszeilenprogramm, das Feinde suchen und durch reguläre Ausdrücke ersetzen .. und nicht sed 'cos sed werden keine neuen Zeilen sehen ..
Barlop

Antworten:

0

Bei der Stapelbearbeitung wird die Datei neu geschrieben. Dies könnte also funktionieren:

:: Q:\Test\2018\04\17\SU_1314377.cmd
@Echo off
SetLocal EnableExtensions EnableDelayedExpansion
Set "File=Accounts.txt"
Set "NewFile=Accounts2.txt"

(For /f "delims=" %%A in (%File%) do (
    Set "Line=%%A"
    Set "Debit=!Line:*Debit=!"
    Set "Credit=!Line:*Credit=!"
    If "!Line!" Neq "!Debit!"  Call Set "Account=%%Line:Debit!Debit!=%%"
    If "!Line!" Neq "!Credit!" Call Set "Line=!Account!Credit!Credit!"
    Echo:!Line!
) )> "%NewFile%" 
  • Der Stapel extrahiert Debit / Credit-Werte (mit führenden Leerzeichen), indem alles in der aktuellen Zeile bis zu den Worten Debit / Credit ersetzt wird.
  • Wenn die aktuelle Zeile Debit enthält, wird der Name vor var Account gespeichert
  • Wenn die aktuelle Zeile Guthaben enthält, wird die Zeile mit dem zuvor gespeicherten Wert neu erstellt
LotPings
quelle