我正在努力理解
$ echo "reverse me" \
| sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
em esrever
(found here)。 但我无法得到
//D
命令。 在删除//
的同时/\n/!{
G
}
s/\(.\)\(.*\n\)/&\2\1/
D
s/.//
它不起作用(似乎是循环)。
我在手册页或sed faq上找不到//地址(有时使用它但未解释)。
任何帮助都将不胜感激。
答案 0 :(得分:1)
: http://www.catonmat.net/blog/sed-one-liners-explained-part-one/
搜索此行:
37. Reverse a line (emulates "rev" Unix command)
答案 1 :(得分:0)
参见手册页:
[2addr] d 删除模式空间的初始段 第一个换行符并开始下一个循环。
答案 2 :(得分:0)
您可以在sed中省略模式的内容并将其设为//
,这意味着将其视为与上次使用的正则表达式相同。通过删除它,您可以在匹配模式时从删除更改为始终删除。
答案 3 :(得分:0)
这可能对您有用:
echo reverse me | sed '/\n/!G;l;s/\(.\)\(.*\n\)/&\2\1/;l;//D;s/.//'
reverse me\n$
reverse me\neverse me\nr$
everse me\nr$
everse me\nverse me\ner$
verse me\ner$
verse me\nerse me\nver$
erse me\nver$
erse me\nrse me\never$
rse me\never$
rse me\nse me\nrever$
se me\nrever$
se me\ne me\nsrever$
e me\nsrever$
e me\n me\nesrever$
me\nesrever$
me\nme\n esrever$
me\n esrever$
me\ne\nm esrever$
e\nm esrever$
e\n\nem esrever$
\nem esrever$
\nem esrever$
em esrever
我在替换命令
之前和之后添加了几个l
命令
sed命令的工作原理如下:
/\n/!G
\(.\)
(AKA \1
)分组,然后将所有内容分组到第一个换行符\(.*\n\)
(AKA \2
),然后将这两个组替换为完整匹配&
然后\2\1
。//D
删除第一个换行符,即删除之前的&
表达式并开始新的循环,但不读取一条新线。有效地循环,直到正则表达式失败。s/.//
前面的换行符