2011-09-17 150 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