sed:'//D';命令

sed:'//D';命令,sed,Sed,我在努力理解 $ echo "reverse me" \ | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' em esrever ()。 但是我没法得到那份工作 //D 指挥部。 在移除// /\n/!{ G } s/\(.\)\(.*\n\)/&\2\1/ D s/.// 它不工作(似乎是一个循环) 我在手册页或sed faq上找不到有关//地址的任何信息(有时会用到它,但没有解释) 如有任何帮助,将不胜感激。在此页面:

我在努力理解

$ echo "reverse me" \ 
| sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
em esrever
()。 但是我没法得到那份工作

//D
指挥部。 在移除//

/\n/!{
G
}
s/\(.\)\(.*\n\)/&\2\1/
D
s/.//
它不工作(似乎是一个循环)

我在手册页或sed faq上找不到有关//地址的任何信息(有时会用到它,但没有解释)

如有任何帮助,将不胜感激。

在此页面:

搜索此行:

37. Reverse a line (emulates "rev" Unix command)
从see手册页:

[2addr]D 通过删除阵列空间的初始段 第一个换行符并开始下一个循环


您可以在sed中省略模式的内容,并将其命名为
/
,这意味着将其视为与上次使用的正则表达式相同。通过删除它,您可以将模式匹配时删除更改为始终删除

这可能适合您:

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
  • regexp将第一个字符
    \(.\)
    (AKA
    \1
    )分组,然后将所有字符分组到第一个换行符
    \(.\n\)
    (AKA
    \2
    )中,然后用整个匹配的
    &
    \2\1
    替换这两个组
  • 如果在替换
    /D
    后上一个regexp为真,则删除到第一个换行符,即删除上一个
    &
    表达式并开始一个新循环,但不读取新行。有效地循环,直到regexp失败
  • 删除第一个字符,即换行符,该换行符位于字符串的前面
    s//

  • 谢谢,所以
    /
    匹配最后一个regexp。这正是我想要的。现在我明白了。