Ihre sed
Ausdruck war ziemlich genau. Allerdings benötigt es einige Mangeln, damit es funktioniert:
$ sed -nr 's/\b(\S+)\s+\1(\s|$)/\1/p' file
dea 123 zy45
12
xyz%[email protected]! kk
abc h h h
Die Idee der ist bereits umgesetzt: Match ein gegebenes Wort mit [^ ]
und sehen Sie, wenn Sie es mit \1
wieder übereinstimmen. Was ich hinzugefügt habe, ist all dies mit \1
ersetzt werden, so dass der wiederholte Block verschwindet.
Anstelle von [^ ]
ist es auch sinnvoll, \S
und statt [ ]
, \s
zu verwenden. Beachten Sie auch die Verwendung von \b
als Wortgrenze, um falsche Positive wie fedorqui qui
und die Verwendung von \1(\s|$)
zu verhindern, um andere falsche Positive wie hello helloa
zu verhindern (danke für die Beispiele WalterA!). Beachten Sie die Verwendung von \s|$
, um entweder ein Leerzeichen oder das Ende der Zeile zu entsprechen; \b
passt zu jedem Nicht-Wort-Zeichen, was es für den Fall mit xyz%[email protected]! kk
nicht sinnvoll macht.
Um zu verhindern, dass alle Zeilen gedruckt werden, verwenden wir sed -n
. Auf diese Weise drucken wir nur (mit) diejenigen, die den regulären Ausdruck durchlaufen, der definiert wurde.
Beachten Sie die Verwendung von -r
, um all jene zu entfernen, die zu Sammelgruppen entkommen. Ohne sie würde der Befehl:
sed -n 's/\b\([^ ]\+\)[ ]\+\1/\1/p' file
Testen sie es mit einem umfassenderen Eingang:
$ cat a
abc2 1 def2 3 abc2
F4
--------------
dea 123 123 zy45
12 12
abc cd abc cd
xyz%[email protected]! xyz%[email protected]! kk
xyzxyz
fedorqui qui
hello helloa
abc h h h h
$ sed -nr 's/\b(\S+)\s+\1(\s|$)/\1/p' a
dea 123zy45
12
xyz%[email protected]!kk
abc hh h
Schauen Sie sich bitte [editing-help] (http://stackoverflow.com/editing-help) an. – Cyrus
Um die Zeile neu zu schreiben, um eines der doppelten Wörter loszuwerden, müssen Sie einen 's ///' Befehl verwenden, nicht 'd'. – Barmar
Sie scheinen ein zusätzliches '' 'und' '' in Ihrem Befehl zu haben, also sehe ich nicht, wie es das tut, was Sie sagen. – Barmar