请教一个正则表达式
21世纪电脑英汉汉英双向辞典中,每个词条下的正文中,都是用~来代替本词条。如果想将这里面所有的~替换回该词条,在ultraedit中如何应用正则表达式啊?谢谢!
例如:
</>
book
1 (C)<br>
a. 书,书籍; 著作<br>
read a ~<br>
读 [著] 书<br>
→ closed book,open book.<br>
b. 知识 [教训] 的泉源, (…之) 书<br>
the ~ of Nature <br>
自然之书<br>
</>
bag
1 (C)<br>
a. 袋<br>
a paper ~ <br>
纸袋<br>
→ carry bag,doggie bag,tote bag.<br>
b. 猎物袋<br>
2 (C)<br>
a. 提袋; 旅行袋,提包<br>
a traveling ~ <br>
旅行袋<br>
</>
P.S.我还想将例句的英文和中文摆在同一行,不过可能难度很高?
例如:
a paper ~ <br>
纸袋<br>
改为
a paper bag 纸袋<br> 这个有价值,支持一下 有点儿麻烦 本帖最后由 zhouxl2000 于 2013-4-15 16:13 编辑
可以提供一个方法,在emeditor中测试可以:
①所有\n替换成""(无);
②</>替换成\n<\>\n;
③^(.*?)( \(.*?)~(.*)$替换成\1\2\1\3,可以多替换几次;
③<br>替换成<br>\n. 好的,我找emeditor试一下,先谢谢了! 本帖最后由 惟吾无为 于 2013-4-13 11:41 编辑
文本处理,当然awk!
windows请安装cygwin或msys。确保可以使用gawk。
linux下面可以直接把代码粘贴到终端执行。
-----
我把你提供的内容保存到了文件o,使用awk完成了所述功能。gawk 'BEGIN{
# 记录分隔符。记录可以理解为一大段要处理的内容,这个就是段落分隔符了。
RS="\r\n</>\r\n"
# 字段分割符。把字段理解为一个句子。此时正好也是换行符。
FS="\r\n"
}{
# 你要把~替换成词条名字。因为文本分割后,标题是第一个字段。
gsub("~",$1)
# \n([ -~]*)<>\r\n 匹配以字母开头的,以<br>结束的,没有中文的行。
# ([^\r\n]+)就是后面跟着的一行了,不限中英文。
# \\1 \\2就是前面两个()里的东西了。 "g"表示全部替换。
$0=gensub("\n([ -~]*)<>\r\n([^\r\n]+)","\n\\1 \\2","g")
# 把结果输出出来。如果想把结果写入文件new.txt,把下面一行的#号去掉。
# printf("%s%s",$0,RS) > "new.txt"
printf("%s%s",$0,RS)
}' o 本帖最后由 惟吾无为 于 2013-4-13 11:41 编辑
效果froms@froms-HP-g4:/dev/shm$ cat o# 你的原始文本
</>
book
1 (C)<br>
a. 书,书籍; 著作<br>
read a ~<br>
读 [著] 书<br>
→ closed book,open book.<br>
b. 知识 [教训] 的泉源, (…之) 书<br>
the ~ of Nature <br>
自然之书<br>
</>
bag
1 (C)<br>
a. 袋<br>
a paper ~ <br>
纸袋<br>
→ carry bag,doggie bag,tote bag.<br>
b. 猎物袋<br>
2 (C)<br>
a. 提袋; 旅行袋,提包<br>
a traveling ~ <br>
旅行袋<br>
</>
froms@froms-HP-g4:/dev/shm$ gawk 'BEGIN{
> # 记录分隔符。记录可以理解为一大段要处理的内容,这个就是段落分隔符了。
> RS="\r\n</>\r\n"
> # 字段分割符。把字段理解为一个句子。此时正好也是换行符。
> FS="\r\n"
> }{
> # 你要把~替换成词条名字。因为文本分割后,标题是第一个字段。
> gsub("~",$1)
> # \n([ -~]*)<>\r\n 匹配以字母开头的,以<br>结束的,没有中文的 行。
> # ([^\r\n]+)就是后面跟着的一行了,不限中英文。
> # \\1 \\2就是前面两个()里的东西了。 "g"表示全部替换。
> $0=gensub("\n([ -~]*)<>\r\n([^\r\n]+)","\n\\1 \\2","g")
> # 把结果输出出来。如果想把结果写入文件new.txt,把下面一行的#号去掉。
> # printf("%s%s",$0,RS) > "new.txt"
> printf("%s%s",$0,RS)
> }' o # 粘贴代码。回车,结果如下。
</>
book
1 (C)<br>
a. 书,书籍; 著作<br>
read a book 读 [著] 书<br>
→ closed book,open book.<br>
b. 知识 [教训] 的泉源, (…之) 书<br>
the book of Nature自然之书<br>
</>
bag
1 (C)<br>
a. 袋<br>
a paper bag纸袋<br>
→ carry bag,doggie bag,tote bag.<br>
b. 猎物袋<br>
2 (C)<br>
a. 提袋; 旅行袋,提包<br>
a traveling bag旅行袋<br>
</>
7# 惟吾无为
看起来很复杂啊,所以曲高和寡,呵 4# zhouxl2000
试了好多次,还是不行,可能是我操作有误。
麻烦能不能截屏图片显示一下操作过程?
谢谢! 7# 惟吾无为
谢谢援手相助。 7# 惟吾无为
看起来很复杂啊,所以曲高和寡,呵
sxingbai 发表于 2013-4-12 20:37 https://pdawiki.com/forum/images/common/back.gif
sed才叫真的复杂。
上面的代码我加了不少注释,去掉#号开头的行。没多少代码。 10# tchon
代码改过了。不然行首为大写时没法合并。
之前疏忽,只在注释中修改了,忘改代码了。 本帖最后由 zhouxl2000 于 2013-4-15 16:33 编辑
4# zhouxl2000
试了好多次,还是不行,可能是我操作有误。
麻烦能不能截屏图片显示一下操作过程?
谢谢!
tchon 发表于 2013-4-13 09:43 https://pdawiki.com/forum/images/common/back.gif
sorry,前面的替代有点问题,将后面的1也包括到单词中。
emeditor可以录制宏,将宏代码保存为test.jsee;
执行时: 宏--选择test.jsee--运行
宏代码:document.selection.Replace("\\n","", eeReplaceAll | eeFindReplaceRegExp);
document.selection.Replace("</>","\\n</>\\n", eeReplaceAll | eeFindReplaceRegExp);
document.selection.Replace("^([^\\d]+)(\\d.*?)~(.*)$","\\1\\2\\1\\3",eeReplaceAll | eeFindReplaceRegExp);
document.selection.Replace("^([^\\d]+)(\\d.*?)~(.*)$","\\1\\2\\1\\3",eeReplaceAll | eeFindReplaceRegExp);
document.selection.Replace("^([^\\d]+)(\\d.*?)~(.*)$","\\1\\2\\1\\3",eeReplaceAll | eeFindReplaceRegExp);
document.selection.Replace("^([^\\d]+)(\\d.*)$","\\1\\n\\2",eeReplaceAll | eeFindReplaceRegExp);
document.selection.Replace("<br>","<br>\\n",eeReplaceAll | eeFindReplaceRegExp);
执行宏后:
</>
book
1 (C)<br>
a. 书,书籍; 著作<br>
read a book<br>
读 [著] 书<br>
→ closed book,open book.<br>
b. 知识 [教训] 的泉源, (…之) 书<br>
the book of Nature <br>
自然之书<br>
</>
bag
1 (C)<br>
a. 袋<br>
a paper bag <br>
纸袋<br>
→ carry bag,doggie bag,tote bag.<br>
b. 猎物袋<br>
2 (C)<br>
a. 提袋; 旅行袋,提包<br>
a traveling bag <br>
旅行袋<br>
</>
P.S.我还想将例句的英文和中文摆在同一行,不过可能难度很高?例如:a paper ~ <br>
纸袋<br>
改为a paper bag 纸袋<br>
12# 惟吾无为
谢谢! 13# zhouxl2000
好的,谢谢!
现在在外面的电脑没有装上emeditor。等过段时间回家再试一下。
再次谢谢! 楼主的想法相当好
页:
[1]