t**********y 发帖数: 374 | 1 aaabbbxccdddx123
aaddxeeffxm234
有简单的linux command line可以做个吗?谢谢了! |
e*******o 发帖数: 4654 | 2 用x split 3部分 然后 在合一块
这个慢 但最清晰
否则就折腾regex
【在 t**********y 的大作中提到】 : aaabbbxccdddx123 : aaddxeeffxm234 : 有简单的linux command line可以做个吗?谢谢了!
|
h**********c 发帖数: 4120 | 3 this not context free so a allittle annoying
W -> [^x]*x[^x]*xB.*
after replace
W' -> [^x]*x[^x]*B.*
So insert a special symbol B after the second x.
then replace xB with epsilon, which is empty string
Two steps:
- replace [^x]*x[^x]*x with [^x]*x[^x]*xB, B must be a special symbol
- replace xB with epsilon
Pipe two sed should do.
【在 t**********y 的大作中提到】 : aaabbbxccdddx123 : aaddxeeffxm234 : 有简单的linux command line可以做个吗?谢谢了!
|
n*w 发帖数: 3393 | |
n******7 发帖数: 12463 | 5 echo 'aaabbbxccdddx123' | sed -r 's/(.+)x/\1/' |
n******7 发帖数: 12463 | 6 我这个在楼主例子还ok,因为他的第二个总是最后一个
对你的例子需要lazy match,我发现GNU标准的regex不支持这个
用perl就好
$ echo 'aaabbbxccdddx12x3' | perl -pe 's|(.*?x.*?)x|\1|'
【在 h**********c 的大作中提到】 : this not context free so a allittle annoying : W -> [^x]*x[^x]*xB.* : after replace : W' -> [^x]*x[^x]*B.* : So insert a special symbol B after the second x. : then replace xB with epsilon, which is empty string : Two steps: : - replace [^x]*x[^x]*x with [^x]*x[^x]*xB, B must be a special symbol : - replace xB with epsilon : Pipe two sed should do.
|
n******7 发帖数: 12463 | 7 靠,那就是echowuhao的方案了
用x split,再用x join,中间n-th x省略
【在 h**********c 的大作中提到】 : this not context free so a allittle annoying : W -> [^x]*x[^x]*xB.* : after replace : W' -> [^x]*x[^x]*B.* : So insert a special symbol B after the second x. : then replace xB with epsilon, which is empty string : Two steps: : - replace [^x]*x[^x]*x with [^x]*x[^x]*xB, B must be a special symbol : - replace xB with epsilon : Pipe two sed should do.
|
e*******o 发帖数: 4654 | 8 如果 你search 以下 有现成答案
不过 没啥意思 可读性太差
真不如split join 直观
要想快 用两次index 就好了
【在 h**********c 的大作中提到】 : this not context free so a allittle annoying : W -> [^x]*x[^x]*xB.* : after replace : W' -> [^x]*x[^x]*B.* : So insert a special symbol B after the second x. : then replace xB with epsilon, which is empty string : Two steps: : - replace [^x]*x[^x]*x with [^x]*x[^x]*xB, B must be a special symbol : - replace xB with epsilon : Pipe two sed should do.
|
|
e*******o 发帖数: 4654 | 9 split 可以带第三个参数 split的份数
【在 n******7 的大作中提到】 : 靠,那就是echowuhao的方案了 : 用x split,再用x join,中间n-th x省略
|
n******7 发帖数: 12463 | 10 忘记次数match了
不过我又看了一下sed,最直接的应该还是用sed -r ‘s/x//n'
比如
echo 'aaabbbxccdddx12x3x3' | sed -r 's/x//3'
【在 h**********c 的大作中提到】 : this not context free so a allittle annoying : W -> [^x]*x[^x]*xB.* : after replace : W' -> [^x]*x[^x]*B.* : So insert a special symbol B after the second x. : then replace xB with epsilon, which is empty string : Two steps: : - replace [^x]*x[^x]*x with [^x]*x[^x]*xB, B must be a special symbol : - replace xB with epsilon : Pipe two sed should do.
|
t**********y 发帖数: 374 | 11 谢谢!
我这里x不一定是最后一个。所以我觉得这个sed -r 通用一些!
【在 n******7 的大作中提到】 : 忘记次数match了 : 不过我又看了一下sed,最直接的应该还是用sed -r ‘s/x//n' : 比如 : echo 'aaabbbxccdddx12x3x3' | sed -r 's/x//3'
|