Notizblock: Wie kann jeder Zeile die letzte Zeile vorangestellt werden, die eine Zeichenfolge enthält?

Notizblock: Wie kann jeder Zeile die letzte Zeile vorangestellt werden, die eine Zeichenfolge enthält?

Ich arbeite mit Chat-Protokollen und möchte diese formatieren.

Sie sehen genau so aus, einschließlich der #-Symbole:

Tuesday, February 24, 2015
##Person1 (21:22:01): hello
##Person2 (21:22:37): hi
Wednesday, February 25, 2015
##Person1 (13:12:43): hey
##Person2 (13:13:04): hey

Das Datum wird nur für jeden neuen Tag veröffentlicht und ich hätte es gerne in etwa diesem Format, sodass es in einer Tabelle bearbeitet werden kann:

Tuesday, February 24, 2015
Tuesday, February 24, 2015##Person1 (21:22:01): hey
Tuesday, February 24, 2015##Person2 (21:22:37): hi
Wednesday, February 25, 2015
Wednesday, February 25, 2015##Person1 (13:12:43): hey
Wednesday, February 25, 2015##Person2 (13:13:04): hey

Danach kann ich einfach die Zeilen löschen, die die Zeichenfolge ## nicht enthalten, um die Nur-Datumszeilen loszuwerden.

Gibt es eine Möglichkeit, Notepad++ dazu zu bringen, die gesamte, letzte Zeile, die einen String vom Datum enthält (wie \d{1,2}, 201\d{1}$), an den Anfang jeder Zeile darunter hinzuzufügen (bis zur nächsten Instanz)?

Antwort1

Ich fürchte, das ist in Notepad++ nicht möglich.

Hier ist ein Perl-Einzeiler, der diese Aufgabe erledigt.

perl -ane '$date = $1 if /^(\w+,\h+\w+\h+\d\d?,\h+20\d\d)/;s/^(?=##)/$date/ && print;' file.txt

Wenn Sie die Datei direkt ersetzen möchten, verwenden Sie:

perl -i -ane '$date = $1 if /^(\w+,\h+\w+\h+\d\d?,\h+20\d\d)/;s/^(?=##)/$date/ && print;' file.txt

Ausgabe:

Tuesday, February 24, 2015##Person1 (21:22:01): hello
Tuesday, February 24, 2015##Person2 (21:22:37): hi
Wednesday, February 25, 2015##Person1 (13:12:43): hey
Wednesday, February 25, 2015##Person2 (13:13:04): hey

Regex-Erklärung:

/               # delimiter
  ^             # beginning of line
  (             # start group 1
    \w+         # 1 or more word character
    ,           # a comma
    \h+         # 1 or more horizontal spaces
    \w+         # 1 or more word character
    \h+         # 1 or more horizontal spaces
    \d\d?       # 1 or 2 digits
    ,           # a comma
    \h+         # 1 or more horizontal spaces
    20\d\d      # 20 and 2 digits
  )             # end group 1
/               # delimiter


s/              # substitute, delimiter
  ^             # beginning of line
  (?=##)        # positive lookahead, zero-length assertion that make sure we have ## at the beginning
/               # delimiter
  $date         # the date found with the preceding  regex
/               # delimiter

verwandte Informationen