sed:'// D'命令

时间:2012-03-14 13:41:38

标签: sed

我正在努力理解

$ 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上找不到//地址(有时使用它但未解释)。

任何帮助都将不胜感激。

4 个答案:

答案 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命令的工作原理如下:

  1. 仅限第一次,在模式空间/\n/!G
  2. 中添加换行符
  3. 正则表达式将第一个字符\(.\)(AKA \1)分组,然后将所有内容分组到第一个换行符\(.*\n\)(AKA \2),然后将这两个组替换为完整匹配&然后\2\1
  4. 如果前一个正则表达式为真,则替换//D删除第一个换行符,即删除之前的&表达式并开始新的循环,但读取一条新线。有效地循环,直到正则表达式失败。
  5. 删除第一个字符,即已经工作到字符串s/.//前面的换行符