首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么[A-Za-z0-9 ]*匹配sed中非ASCII字母之间的空格?

为什么[A-Za-z0-9 ]*匹配sed中非ASCII字母之间的空格?
EN

Stack Overflow用户
提问于 2012-09-16 19:53:09
回答 4查看 1.5K关注 0票数 0

我正在尝试标记一个文件中的所有拉丁字母组成,例如:

代码语言:javascript
复制
This is English. 这是中文。 This is more English.

这将被标记为:

代码语言:javascript
复制
\english{This is English.} 这是中文。 \english{This is more English.}

我尝试使用sed来标记这些单词:

代码语言:javascript
复制
sed 's/[A-Za-z0-9 ]*/\\english{&}/g' file

运行后,它基本上是正确的,但是,它也是在所有中文字符之间放置标记,例如:

代码语言:javascript
复制
\english{This is English.} 这\english{}是\english{}中\english{}文\english{}。 \english{This is more English.}

它还标记只是一个空格,但不需要标记的地方,例如:

代码语言:javascript
复制
这是中文。 这也是中文。

这会变成:

代码语言:javascript
复制
这是中文。\english{ }这也是中文。

如何修改此sed脚本,使其不将字符之间的空格标记为\english{},并且不在文件中放置任何\english{ }

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-16 20:05:00

使用GNU sed的一种方式

代码语言:javascript
复制
LC_ALL="POSIX" sed -r 's/[^\o200-\o377]+/\\english{&}/g' file.txt

结果:

代码语言:javascript
复制
\english{This is English. }这是中文。\english{ This is more English.}
票数 2
EN

Stack Overflow用户

发布于 2012-09-16 20:11:40

字符之间的标记是由*引起的,它意味着“零或更多”。如果您是指“一个或多个”,请使用\+而不是*

如果你不想匹配一个空格,你可以使用例如

代码语言:javascript
复制
sed 's/[A-za-z0-9][A-Za-z0-9 ]*/\\english{&}/g'

这意味着必须至少有一个非空格字符。

票数 2
EN

Stack Overflow用户

发布于 2012-09-16 20:01:05

[A-Za-z0-9 ]*本质上是指匹配任何拉丁字母、阿拉伯数字和空格。

你想要像([A-Za-z][-A-Za-z0-9 ,.!?']*)这样的东西

有一些很好的RegExp实验工具,比如RegexPal

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12446642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档