我试图在文件中标记所有拉丁字母组件,例如:
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{ }
?
答案 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
含义匹配任何字母数字字符,后跟零个或多个空格。