我需要一个表达式,只允许按字母顺序排列字母而不重复,允许使用空格。 例如:
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
它不适用于空格,并且根本不起作用
答案 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
对我来说足够了。谢谢大家。很棒的答案。