Câu trả lời:
Bạn có thể sử dụng một lớp ký tự :
/[^\s\\]/
khớp với bất kỳ thứ gì không phải là ký tự khoảng trắng cũng không phải là a \
. Đây là một ví dụ khác:
[abc]
có nghĩa là "khớp a
, b
hoặc c
"; [^abc]
có nghĩa là "phù hợp với bất kỳ ký tự trừ a
, b
hoặc c
".
$0~/\s*^\s/
tiếp theo bất kỳ nhân vật đó không phải là một không gian trắng
/^\s+/
- bắt đầu dòng, theo sau là một hoặc nhiều ký tự khoảng trắng.
g
sửa đổi. /[^\s\\]/g
Bạn có thể sử dụng một cái nhìn trước:
/(?=\S)[^\\]/
/(?=\S)\W/
THIS IS A TEST, AND AGAIN
. Điều sau làm việc tốt cho tôi (?=\S)[^"]*
.
Điều này làm việc cho tôi bằng cách sử dụng sed [ Chỉnh sửa: bình luận bên dưới chỉ ra sed không hỗ trợ \ s]
[^ ]
trong khi
[^\s]
không
# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg
echo "ghai ghai" | sed "s/[^ g]//g"
g g
\s
phù hợp hơn với ký tự khoảng trắng. Nó bao gồm TAB, ký tự xuống dòng của nguồn cấp dữ liệu và những thứ khác (bao nhiêu cái khác tùy thuộc vào hương vị regex). Đó là một phát minh của Perl, ban đầu là cách viết tắt của lớp ký tự POSIX [:space:]
và không được hỗ trợ sed
. Regex đầu tiên của bạn ở trên phải là s/[^[:space:]g]//g
.
echo "ghai ghai" | sed "s/[^[:space:]g]//g"
Sản lượng:g g
Trên hệ thống của tôi: CentOS 5
Tôi có thể sử dụng \s
bên ngoài bộ sưu tập nhưng phải sử dụng [:space:]
bên trong bộ sưu tập. Trong thực tế, tôi chỉ có thể sử dụng các [:space:]
bộ sưu tập bên trong. Vì vậy, để phù hợp với một không gian duy nhất bằng cách sử dụng này, tôi phải sử dụng [[:space:]]
Đó là thực sự kỳ lạ.
echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"
Result: a b cX
\s
[[:space:]]
[^[:space:]]
Hai điều này sẽ không hoạt động:
a[:space:]b instead use a\sb or a[[:space:]]b
a[^\s]b instead use a[^[:space:]]b
([^[:space:]])
thay thế ([^\s])
. Tôi đang ở trên openSUSE Tumbleweed 2018 04 03.
^
hiểu là phủ định và khi nào dòng bắt đầu? Trong khía cạnh đó, tại sao điều này wont phù hợp với một dòng bắt đầu với số lượng chỗ trắng$0~/\s*^\s/