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

时间:2012-09-16 11:53:09

标签: sed

我试图在文件中标记所有拉丁字母组件,例如:

This is English. 这是中文。 This is more English.

这将标记为:

\english{This is English.} 这是中文。 \english{This is more English.}

我尝试使用sed标记字词:

sed 's/[A-Za-z0-9 ]*/\\english{&}/g' file

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

\english{This is English.} 这\english{}是\english{}中\english{}文\english{}。 \english{This is more English.}

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

这是中文。 这也是中文。

这变为:

这是中文。\english{ }这也是中文。

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

4 个答案:

答案 0 :(得分:2)

使用GNU sed的一种方式:

LC_ALL="POSIX" sed -r 's/[^\o200-\o377]+/\\english{&}/g' file.txt

结果:

\english{This is English. }这是中文。\english{ This is more English.}

答案 1 :(得分:2)

字符之间的标记是由*引起的,表示“零或更多”。如果您的意思是“一个或多个”,请使用\+代替*

如果您不想匹配单个空格,可以使用例如

sed 's/[A-za-z0-9][A-Za-z0-9 ]*/\\english{&}/g'

表示必须至少有一个非空格字符。

答案 2 :(得分:1)

[A-Za-z0-9 ]*实质上意味着匹配任何拉丁字母,阿拉伯数字和空格。

您需要([A-Za-z][-A-Za-z0-9 ,.!?']*)

之类的内容

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

答案 3 :(得分:1)

您的正则表达式意味着:匹配任何字母数字字符和任何空格。因此,中文文本之间的空格也是匹配的。

试试这个:

 's/[A-Za-z0-9]* */\\english{&}/g' file

含义匹配任何字母数字字符,后跟零个或多个空格。