我有一个文本文件。如果有多个以@开头的连续行,我想删除所有这些行,除了最后一次出现@的行。
例如,假设我有输入文件:
ABC
@abc
@def
333
@asd
@poi
@ 789
输出应为:
ABC
@def
333
@ 789
答案 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)
/^@/ { 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 }