Ответы:
Вы можете использовать класс символов :
/[^\s\\]/
соответствует всему, что не является пробельным символом или символом \
. Вот еще один пример:
[abc]
означает «матч a
, b
или c
»; [^abc]
означает «любой символ , кроме a
, b
или c
».
$0~/\s*^\s/
за которым следует любой символ,
/^\s+/
- начало строки, за которым следует один или несколько пробелов.
g
модификатор. /[^\s\\]/g
Вы можете использовать опережающий просмотр:
/(?=\S)[^\\]/
/(?=\S)\W/
THIS IS A TEST, AND AGAIN
. Следующее сработало для меня (?=\S)[^"]*
.
Это сработало для меня, используя 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"
Урожайность:g g
В моей системе: 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.
^
интерпретируется как отрицание, а когда как начало строки? В этом отношении, почему это не соответствует строке, начинающейся с количества пробелов,$0~/\s*^\s/