В Perl \S
соответствует любой символ без пробелов.
Как я могу сопоставить любой символ без пробелов, кроме обратного слэша \
?
Вы можете использовать класс :
/[^\s\\]/
соответствует любому символу пробела, а не символу \
. Вот еще один пример:
[abc]
означает "соответствие a
, b
или c
"; [^abc]
означает "соответствовать любому символу, кроме a
, b
или c
".
Вы можете использовать lookahead:
/(?=\S)[^\\]/
В моей системе: CentOS 5
Я могу использовать \s
вне коллекций, но должен использовать [:space:]
внутри коллекций. На самом деле я могу использовать [:space:]
только внутри коллекций. Поэтому, чтобы соответствовать одному пространству, используя это, я должен использовать [[:space:]]
Что действительно странно.
echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"
Result: a b cX
\s
[[:space:]]
[^[:space:]]
Эти два не будут работать:
a[:space:]b instead use a\sb or a[[:space:]]b
a[^\s]b instead use a[^[:space:]]b
([^[:space:]])
вместо ([^\s])
. Я на openSUSE Tumbleweed 2018 04 03.
Это сработало для меня с помощью комментария sed [ Изменить: ниже, если sed не поддерживает \s]
[^ ]
а
[^\s]
не
# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg
echo "ghai ghai" | sed "s/[^ g]//g"
g g
\s
соответствует больше, чем просто символ пробела. Она включает в себя TAB, перевод строки возврат каретки, и другие (как и многие другие , зависит от регулярного выражения вкуса). Это изобретение Perl, изначально сокращенное для класса символов POSIX [:space:]
, и не поддерживается в sed
. Ваше первое регулярное выражение должно быть s/[^[:space:]g]//g
.
echo "ghai ghai" | sed "s/[^[:space:]g]//g"
Выход: gg
^
интерпретируется как отрицание, а когда - как начало строки? В этом отношении, почему это не будет соответствовать строке, начинающейся с числа пробелов$0~/\s*^\s/