Fried-rich schrieb:
Ich hab das nicht per sed sondern einfach in einem Texteditor (Geany) für eine sehr umfangreiche Textdatei gemacht.
Bei mir hat
([^0-9])\. ([a-z][^wort1|wort2])
funktioniert, obwohl ich nicht verstehe wieso.
Weil "wort1" und "word2" aus eben diesen Buchstaben bestehen. Wenn Du "wor" verwendest, wird das davon ebenso erwischt, was aber falsch wäre. Um entscheiden zu können, ob ein Match wirklich funktioniert, braucht es klug ausgewählte Testfälle, damit man nicht in solche Fallen tappt.
Scheinbar wird hier "[a-z][^wort1|wort2]" interpretiert mit "alles von a-z, außer die Wörter 'wort1' und 'wort2'.
Nein, sicher nicht. [^wort1|word2] matched ein Zeichen, das keiner der erwähnten Buchstaben und nicht "1", "2" oder "|" ist.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | $ for c in {a..z} \|; do echo $c; done >alphabet
$ grep '[^wort1|word2]' alphabet | diff -U3 alphabet -
--- alphabet 2021-08-31 23:10:56.243783681 +0200
+++ - 2021-08-31 23:11:03.593125400 +0200
@@ -1,7 +1,6 @@
a
b
c
-d
e
f
g
@@ -12,16 +11,11 @@
l
m
n
-o
p
q
-r
s
-t
u
v
-w
x
y
z
-|
|
Spontan hätte ich eher gedacht das ganze wird interpretiert als "alles von a-z, danach alles außer wort1 oder wort2".
Nein. Das Pattern oben matched ein Zeichen, das keine Ziffer ist, gefolgt von einem Punkt und einem Leerzeichen, gefolgt von einem Zeichen aus a bis z, gefolgt von einem Zeichen, das nicht w, o, r, t, d, 1, 2 oder | ist. Die Klammern sind völlig überflüssig, weil sie weder mit einem Quantifizierer versehen sind, noch innerhalb eine Alternative beinhalten - es sei denn, Du willst bestimmte Teile beim Matchen extrahieren.