2009-12-02 24 views
0

看着这样的:文本阅读和替换算法

MENU_ITEM_BACK#0="Back"; 
MENU_ITEM_BLOCK_CHANNEL#0="Block"; 
MENU_ITEM_CLOSE#0="Close"; 
MENU_ITEM_DETAILS#0="Details"; 
MENU_ITEM_DIAGNOSE#0="Diagnose"; 
MENU_ITEM_DOWNLOAD#0="Download"; 

...等(500线)。自动将标签名称复制到标签本身的最佳方式是什么?例如,

MENU_ITEM_BACK#0="Back"; 

将成为

MENU_ITEM_BACK#0="MENU_ITEM_BACK"; 

我最熟悉Java,但不反对任何其他的编程语言,虽然我不是很熟悉正则表达式(编码者至少) 。

编辑:它引起了我的注意,'#0 ='并不总是恒定的。有时他们可以被一个非常任意的数字替代,例如'#6548135 ='。给出的答案很好,但由于我对正则表达式不熟悉,你会如何适应这个问题?请注意,我不想复制数字,只是标签。

+0

#0是恒定的吗?你熟悉sed吗?红宝石?蟒蛇? – 2009-12-02 20:18:41

回答

1

您可以使用Microsoft Word在没有正则表达式的情况下执行此操作。将代码的部分复制到Word中。然后使用列选择(按住Alt键并用鼠标选择),然后将其复制到右侧,并使用搜索和替换进行清理。

+0

列选择如何与不同大小的列一起工作? – 2009-12-03 14:11:42

+0

这里有一种方法:在每一行的右侧添加一个空格。在第一行中,添加足够的空格,因此它是最长的行。选择所有行的列,足够宽以包含每个名称和尾部空格。将列粘贴到右侧足够远,以便它不与任何文本重叠。第一行的空格将允许这样做。即使行长度不同,它也可以工作。 – xpda 2009-12-03 15:48:40

+0

我是个白痴。在excel中花了2分钟。 – Jay 2009-12-03 20:28:13

2

我认为正则表达式是一个不错的选择,假设标签不能有任何#字符。只需使用

\1="\1"; 

更换

^([^#]+#0)=".*";$ 

如果你想这样做的一个程序或脚本,您需要使用您的选择的正则表达式语言设施。

如果你想为只是一次为这个特定文件做到这一点,你可以用SED做到这一点:

$ sed -e "s/^([^#]+#0)=".*";$/\1=\"\1\"/" file 
1

正则表达式,如使用sed的:

sed -r 's/^([^#]+)([^=]+)=.*$/\1\2="\1"/' yourfile.txt 

在Python同样的事情:

import sys 
import re 

for line in sys.stdin.readlines(): 
    print re.sub('^([^#]+)([^=]+)=.*$', r'\1\2="\1"', line).rstrip() 

用法:

python program.py < yourfile.txt 
1

使用正则表达式搜索和替换,如用Perl,sed的,AWK或受到许多最近的文本编辑的支持。

在Perl中,这将达到目的:

my $text = <<END_YOUR_TEXT; 
PUT YOUR TEXT HERE 
END_YOUR_TEXT 
$text =~ s/(MENU_ITEM_[^#]+)#0="[^"]+";/$1#0="$1";/g 
print $text; 

的 “$ 1” 是将括号内的比赛,例如参考MENU_ITEM_BACK。

来读取在命令行一个文件中的文本,啜它:

我的$文字= <>;