使用sed删除带有重复和增量字符的字符串?

时间:2011-09-17 17:49:54

标签: linux bash unix sed

我正在尝试使用sed删除包含重复字符的字符串,然后再将它们附加到文件中。 到目前为止,我有这个,连续重复,如'AA'或'22',但我正在努力完整的字符串重复和增量字符。

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'会解析到该文件。

希望有所帮助。

1 个答案:

答案 0 :(得分: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调用更具可读性,并具有相同的功能。