我正在尝试标记一个文件中的所有拉丁字母组成,例如:
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{ }?
发布于 2012-09-16 20:05:00
使用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-16 20:11:40
字符之间的标记是由*引起的,它意味着“零或更多”。如果您是指“一个或多个”,请使用\+而不是*。
如果你不想匹配一个空格,你可以使用例如
sed 's/[A-za-z0-9][A-Za-z0-9 ]*/\\english{&}/g'这意味着必须至少有一个非空格字符。
发布于 2012-09-16 20:01:05
[A-Za-z0-9 ]*本质上是指匹配任何拉丁字母、阿拉伯数字和空格。
你想要像([A-Za-z][-A-Za-z0-9 ,.!?']*)这样的东西
有一些很好的RegExp实验工具,比如RegexPal
https://stackoverflow.com/questions/12446642
复制相似问题