Antworten:
Sie können eine Zeichenklasse verwenden :
/[^\s\\]/
passt zu allem, was weder ein Leerzeichen noch ein Leerzeichen ist \
. Hier ist ein weiteres Beispiel:
[abc]
bedeutet „Spiel a
, b
oder c
“; [^abc]
bedeutet „ mit Ausnahme jedes Zeichen a
, b
oder c
“.
$0~/\s*^\s/
gefolgt von einem Zeichen, das kein Leerzeichen ist
/^\s+/
- Zeilenanfang, gefolgt von einem oder mehreren Leerzeichen.
g
Modifikator hinzu. /[^\s\\]/g
Sie können einen Lookahead verwenden:
/(?=\S)[^\\]/
/(?=\S)\W/
THIS IS A TEST, AND AGAIN
. Das Folgende hat bei mir gut funktioniert (?=\S)[^"]*
.
Dies funktionierte bei mir mit sed [ Bearbeiten: Kommentar unten weist darauf hin, dass sed \ s nicht unterstützt]
[^ ]
während
[^\s]
nicht
# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg
echo "ghai ghai" | sed "s/[^ g]//g"
g g
\s
entspricht mehr als nur dem Leerzeichen. Es enthält TAB, Zeilenvorschubwagenrücklauf und andere (wie viele andere hängen vom Regex-Geschmack ab). Es ist eine Perl-Erfindung, ursprünglich eine Abkürzung für die POSIX-Zeichenklasse [:space:]
, die in nicht unterstützt wird sed
. Ihre erste Regex oben sollte sein s/[^[:space:]g]//g
.
echo "ghai ghai" | sed "s/[^[:space:]g]//g"
Erträge:g g
Auf meinem System: CentOS 5
Ich kann \s
außerhalb von Sammlungen verwenden, muss aber [:space:]
innerhalb von Sammlungen verwenden. Tatsächlich kann ich [:space:]
nur innerhalb von Sammlungen verwenden. Um ein einzelnes Leerzeichen damit abzugleichen, muss ich das verwenden, [[:space:]]
was wirklich seltsam ist.
echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"
Result: a b cX
\s
[[:space:]]
[^[:space:]]
Diese beiden werden nicht funktionieren:
a[:space:]b instead use a\sb or a[[:space:]]b
a[^\s]b instead use a[^[:space:]]b
([^[:space:]])
stattdessen verwenden müssen ([^\s])
. Ich bin auf openSUSE Tumbleweed 2018 04 03.
^
als Negation interpretiert und wann als Zeilenanfang? In dieser Hinsicht, warum dies nicht mit einer Linie übereinstimmt, die mit der Anzahl der Leerzeichen$0~/\s*^\s/