我正在尝试使用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'会解析到该文件。
希望有所帮助。
答案 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调用更具可读性,并具有相同的功能。