0

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

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{ }在文件中放置任何 's?

4

4 回答 4

2

一种使用方式GNU sed

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

结果:

\english{This is English. }这是中文。\english{ This is more English.}
于 2012-09-16T12:05:00.330 回答
2

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

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

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

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

于 2012-09-16T12:11:40.160 回答
1

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

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

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

于 2012-09-16T12:01:04.810 回答
1

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

试试这个:

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

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

于 2012-09-16T12:02:37.440 回答