【问题标题】:Match and replace block using regex with sed on Solaris在 Solaris 上使用带有 sed 的正则表达式匹配和替换块
【发布时间】:2018-03-29 14:26:24
【问题描述】:

这适用于 regex101.com 等一些工具,但我无法使其与 sed 一起使用。

块:

dn: abcd1,ou=test
aaaaa
bbbb
1111

dn: abcd2,ou=test
33333
ddddd
aaaaa

dn: qwert,ou=test
55555
hhhh
dddd

我想匹配并替换以 dn: abcd 开头的每个块。一个块总是以\n\n结尾。

正则表达式:(?s)\b(?:(?!\n\n).)*?\bdn: abcd\b(?:(?!\n\n).)*

用sed可以实现吗?

【问题讨论】:

  • 尝试使用perl... sed 不支持环视或非捕获组以及 perl 中可用的许多其他功能...
  • 另外,如果您可以在没有\n 的情况下修改给定的输入样本(假设您有文字换行符而不是\ 后跟n) - 使用编辑器中的{} 按钮来格式化示例而不是反引号..并添加完整的预期输出,这将有助于提出解决方案..
  • @Sundeep 已编辑,谢谢!我不熟悉 perl,有什么想法吗?

标签: sed solaris solaris-10


【解决方案1】:

是此任务的更好选择。

$ perl -00ne 'print if not /^dn: abcd/' file

$ perl -ne 'print if not /^dn: abc/ .. /^$/' file

dn: qwert,ou=test
55555
hhhh
dddd

【讨论】:

    【解决方案2】:

    使用awk的段落模式

    $ awk -v RS= '!/^dn: abcd/' ip.txt
    dn: qwert,ou=test
    55555
    hhhh
    dddd
    
    • -v RS=当RS设置为空字符串时,一个或多个连续的空行作为输入记录分隔符
    • !/^dn: abcd/ 忽略以 dn: abcd 开头的段落

    请注意,默认输出记录分隔符是单个换行符,因此您可能需要这样的内容:

    $ awk -v RS= -v ORS='\n\n' '!/^dn: abcd1/' ip.txt
    dn: abcd2,ou=test
    33333
    ddddd
    aaaaa
    
    dn: qwert,ou=test
    55555
    hhhh
    dddd
    

    【讨论】:

      【解决方案3】:

      你可以试试这个 sed

      sed '/^dn: abcd/,/^$/d' infile
      

      【讨论】:

        猜你喜欢
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        相关资源
        最近更新 更多