【问题标题】:how to delete two lines that starts with same character in sed?如何删除sed中以相同字符开头的两行?
【发布时间】:2012-07-17 04:57:42
【问题描述】:

我有一个文本文件。如果有多个以@开头的连续行,我想删除所有这些行,除了最后一次出现@的行。

例如,假设我有输入文件:

abc

@abc

@def

333

@asd

@poi

@789

输出应该是:

abc

@def

333

@789

【问题讨论】:

  • 我不认为你可以用 sed 来做到这一点,因为它可以单独处理每一行输入
  • @poncha 将它与 tr 一起使用——请参阅下面的答案。我刚刚发现了 tr,但它非常有用。
  • @Kasapo 感谢您的提示...但是您需要将其替换为文本中不确定出现的一些字符...不是吗?
  • 不,只是使用一个空间并计划它......好吧,我想如果保留换行符非常重要,那么是的,你可能必须选择一些时髦的角色(我更喜欢元我确定文本文件中不存在的字符,或三重@signs或三重管道)
  • 我认为 awk 将是这里的答案......

标签: bash shell sed awk


【解决方案1】:

您可以将 tr 与 sed 一起使用:

cat input_file | tr '\n' ' ' | sed s/<pattern>//

tr 用空格替换换行符,使正则表达式更容易。

这种模式似乎有效:

cat file.txt | tr '\n' ' ' | sed -e "s/\(@\w*\s\)*\(@\w*\s\)/\2/g"

【讨论】:

  • 您可能需要稍微调整一下,但它与您提供的输入配合得很好。我会把测试和潜在的调试留给你:)
  • +1 ;) 但如果 original 可以包含空格,您将需要想出一些其他足够独特的字符作为分隔符(然后正则表达式也会改变)
  • 确实,您可以使用tr '\n' '#' 或其他如果您知道某些不会出现在您的文本文件中的字符。或者,如果您知道源代码中没有空格,只需将空格改回换行符即可。无论如何为poncha +1
【解决方案2】:

我看到了 awk 标签。所以我添加了一个 awk 单行,它可以解决你的问题:(见下面的测试)

kent$  cat a.txt
abc
@abc
@def
333
@asd
@poi
@789

kent$  awk 'BEGIN{FS=""}
        {if(c==$1){l=$0;next;} if(c) print l;c=$1;l=$0;} 
        END{print }' a.txt 
abc
@def
333
@789

【讨论】:

    【解决方案3】:

    多行sed解决方案:

    sed -n '
      $p         # Always print last line
      N          # Append next line to pattern space
      /@.*\n@/D  # Delete first line of pattern space if both
                 # lines start with an @, and start over
      P          # Otherwise print first line of pattern space,
      D          # delete it and start over
      ' infile
    

    【讨论】:

    • 一件事——如果@-words 之间有两个空行,我认为这将失败。不过,在“\n”中添加星号应该可以解决问题,对吧?有趣的选项传递给sed
    • 或者\+。是的,在sed 中解决这些问题是一个很好的挑战。信息页面信息量很大。
    【解决方案4】:

    http://ideone.com/Ng7p2

    /^@/ { last_line=$0; line_to_print=true }
    /^[^@]/ { if ( line_to_print == true ) print last_line; print $0; line_to_print=false }
    END { if ( line_to_print == true ) print last_line }
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2020-04-09
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      相关资源
      最近更新 更多