【问题标题】:sed: '//D' commandsed: '//D' 命令
【发布时间】:2012-03-15 04:14:47
【问题描述】:

我正在努力理解

$ 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 常见问题解答(有时使用但未解释)。

任何帮助将不胜感激。

【问题讨论】:

    标签: sed


    【解决方案1】:

    在此页面中: http://www.catonmat.net/blog/sed-one-liners-explained-part-one/

    搜索这一行:

    37. Reverse a line (emulates "rev" Unix command)
    

    【讨论】:

    • 谢谢,所以// 匹配最后一个正则表达式。这正是我一直在寻找的。现在我明白了。
    【解决方案2】:

    参见手册页:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这可能对你有用:

        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. 正则表达式将第一个字符 \(.\) (AKA \1) 分组,然后将所有内容分组到第一个换行符 \(.*\n\) (AKA \2),然后将这两个组替换为整个匹配 & 然后 @ 987654329@.
        3. 如果在替换 //D 之后之前的正则表达式为真,则删除到第一个换行符,即删除之前的 & 表达式并开始新的循环,但 不要 读取新行。有效循环,直到正则表达式失败。
        4. 删除第一个字符,即在字符串 s/.// 前面起作用的换行符

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-03
          • 1970-01-01
          • 1970-01-01
          • 2018-10-28
          • 2017-11-09
          • 1970-01-01
          相关资源
          最近更新 更多