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, boder c“; [^abc]bedeutet „ mit Ausnahme jedes Zeichen a, boder c“.
$0~/\s*^\s/gefolgt von einem Zeichen, das kein Leerzeichen ist
/^\s+/- Zeilenanfang, gefolgt von einem oder mehreren Leerzeichen.
gModifikator 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
\sentspricht 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 \sauß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/