如何删除sed中以相同字符开头的两行?

时间:2012-07-16 14:40:59

标签: bash shell sed awk

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

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

  

ABC

     

@abc

     

@def

     

333

     

@asd

     

@poi

     

@ 789

输出应为:

  

ABC

     

@def

     

333

     

@ 789

4 个答案:

答案 0 :(得分:2)

您可以在sed中使用tr:

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

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

这种模式似乎有效:

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

答案 1 :(得分:1)

多行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

答案 2 :(得分:1)

我看到了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 :(得分:0)

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 }