2011-09-17 67 views
0

我试图使用sed删除包含重复字符的字符串,然后将它们附加到文件。 到目前为止,我有这种情况,以连续重复的方式(如'AA'或'22')来甩掉叮咬,但是我正在用全字符串重复和增量字符挣扎。使用sed删除重复和增量字符的字符串?

generic string generator | sed '/\([^A-Za-z0-9_]\|[A-Za-z0-9]\)\1\{1,\}/d' >> parsed sting to file 

我也想丢弃字符串包含像'ABA'的任何重复。 以及包含任何升序或降序字符(如'AEF'或'AFE')的字符串。

我假设它会更容易使用sed的多个过程删除不需要的字符串。

**更多的信息可以尝试避免所提到的XY问题。 **

字符串的长度可以是8到64,但在这个例子中,我将重点放在8.虽然同时我限制了字符串的生成,只输出一个大写字母串(AZ)。这是由于几个原因,但主要是我不希望生成的文件具有可笑的巨大足迹。

随着sed从流中丢弃不必要的输出(如“AAAAAAAA”和“AAAAAAAB”)的第一遍。这导致文件以字符串'ABABABAB'和'ABABABAC'开头。

下一步我想检查从一个字符到下一个字符不会增加或减少一个值。所以像'ABABABAB'这样的字符串会被删除,但'ACACACAC'会解析到这个流。

下一步我想删除整个字符串中包含任何重复字符的字符串。所以像'ACACACAC'这样的字符串会被删除,但'ACEBDFHJ'会解析该文件。

希望有所帮助。

+0

对不起,我不明白你的问题,足以提供一个sol。另外,虽然我可以看到AEF是如何上升的,但我没有看到AFE如何成为一个desc str,我期望FEA作为一个desc。海峡。 '...更容易..多次传球......',是的。你也可以使用1个进程链接sed cmds组,以保持同一行上的处理,即'sed's/A/Z/g; s/B/Y/g; s/C/X /'in> out' 。你可以创建一个完整的cmds文件,每行1's/A/Z/g',并像'sed -f fixData.sed in> out'一样使用它。你还会看到人们使用'-e'选项,比如'sed -e's/A/Z/g; s/B/Y/g ...',甚至是'sed -e's/A/Z/g'-e/s/B/Y/g'...' – shellter

+2

实际上使用ask,perl,python或ruby会更容易... –

+0

经典[XY问题](http:// meta。 stackexchange.com/questions/66377/what-is-the-xy-problem)。你能否描述一下你试图生成的字符串的属性? (_而不是描述(严重)你自己如何解决你的问题_) – sehe

回答

2

为了完成你用sed描述的内容,你需要多次运行它。由于SED不明白“这个角色是从这个其它字符增量”的概念,你需要在所有可能的组合运行:

sed '/AB/d' 
sed '/BC/d' 
sed '/CD/d' 
sed '/DE/d' 

对于降人物,同样的事情:

sed '/BA/d' 
sed '/CB/d' 

为了再滴串反复字符,你可以做这样的事情:

sed '/\(.\).*\1/d' 

下应该做的伎俩:

generic string generator |sed '/\(.\).*\1/d'|sed /BA/d|sed /AB/d||sed /CB/d|sed /BC/d|sed /DC/d|sed /CD/d|sed /ED/d|sed /DE/d|sed /FE/d|sed /EF/d|sed /GF/d|sed /FG/d|sed /HG/d|sed /GH/d|sed /IH/d|sed /HI/d|sed /JI/d|sed /IJ/d|sed /KJ/d|sed /JK/d|sed /LK/d|sed /KL/d|sed /ML/d|sed /LM/d|sed /NM/d|sed /MN/d|sed /ON/d|sed /NO/d|sed /PO/d|sed /OP/d|sed /QP/d|sed /PQ/d|sed /RQ/d|sed /QR/d|sed /SR/d|sed /RS/d|sed /TS/d|sed /ST/d|sed /UT/d|sed /TU/d|sed /VU/d|sed /UV/d|sed /WV/d|sed /VW/d|sed /XW/d|sed /WX/d|sed /YX/d|sed /XY/d|sed /ZY/d|sed /YZ/d 

我只测试了这个在几个输入样本,但他们似乎都工作。

请注意,这是相当笨拙的,并会更好地完成一些比sed更复杂的东西。这里是一个python示例:

import math 
def isvalid(x): 
    if set(len(x)) < len(x): 
    return False 
    for a in range(1, len(x)): 
    if math.fabs(ord(x[a])-ord(x[a-1])) == 1: 
     return False 
    return True 

这比sed调用的巨集更可读,并且具有相同的功能。

+0

出于同样的原因,我甚至没有考虑过使用任何类型的脚本。你给了我一个有趣的想法(对我来说很有趣,可能对这里的大部分都很无聊)。我会试着去刷一下我非常生锈的c/C++来完成这个技巧。 谢谢! – xentoo