正则表达式与sed,字母顺序没有重复

时间:2016-03-10 18:32:53

标签: regex sed

我需要一个表达式,只允许按字母顺序排列字母而不重复,允许使用空格。 例如:

  

abc d efg
  abcd efg
  bcdefg h

我必须使用" sed"。由于我不能使用超前表达。
Sed读取文件,并且在每个字符串中必须找到与示例匹配的子字符串 我现在最好的就是:

sed -nr 's/^[a-g]*(a?b?c?d?e?f?g?)[a-g]*$/\1/gp' test.txt 


它不适用于空格,并且根本不起作用

5 个答案:

答案 0 :(得分:1)

建议您尝试[a-h]范围内的字母:

sed -nr '/^a? *b? *c? *d? *e? *f? *g? *h? *$/p' test.txt

答案 1 :(得分:0)

使用GNU sed:

sed -nE '/^a{0,1} *b{0,1} *c{0,1} *d{0,1} *e{0,1} *f{0,1} *g{0,1} *h{0,1} *i{0,1} *j{0,1} *k{0,1} *l{0,1} *m{0,1} *n{0,1} *o{0,1} *p{0,1} *q{0,1} *r{0,1} *s{0,1} *t{0,1} *u{0,1} *v{0,1} *w{0,1} *x{0,1} *y{0,1} *z{0,1} *$/p' file

答案 2 :(得分:0)

cat test.txt |  sed -e "/\([a-z]\).*\1/d" |  grep -E "^ *a* *b* *c* *d* *e* *f* *g* *h* *i* *j* *k* *l* *m* *n* *o* *p* *q* *r* *s* *t* *u* *v* *w* *x* *y* *z* *$"

grep -E "^ *a? *b? *c? *d? *e? *f? *g? *h? *i? *j? *k? *l? *m? *n? *o? *p? *q? *r? *s? *t? *u? *v? *w? *x? *y? *z? *$" test.txt

sed -nE '/^ *a? *b? *c? *d? *e? *f? *g? *h? *i? *j? *k? *l? *m? *n? *o? *p? *q? *r? *s? *t? *u? *v? *w? *x? *y? *z? *$/p' test.txt

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r 'h;s/ //g;/(.).*\1/d;s/.*/&\nzyxwvutsrqponmlkjihgfedcba/;:a;ta;/^\n/!s/^(.)(.*\n.*)\1.*/\2/;ta;/^.+\n/d;x'

复制该行然后删除空格。如果该行包含重复项,请将其删除。否则从正面开始,按字母顺序删除每个字符,如果成功,则恢复原始行。否则删除该行。

答案 4 :(得分:0)

sed -nE 's/[a-z]*(^a{0,1} *b{0,1} *c{0,1} *d{0,1} *e{0,1} *f{0,1} *g{0,1} *h{0,1} *i{0,1} *j{0,1} *k{0,1} *l{0,1} *m{0,1} *n{0,1} *o{0,1} *p{0,1} *q{0,1} *r{0,1} *s{0,1} *t{0,1} *u{0,1} *v{0,1} *w{0,1} *x{0,1} *y{0,1} *z{0,1} *)[a-z]*$/\1/gp' file.txt 对我来说足够了。谢谢大家。很棒的答案。