我有一个文本文件。如果有多个以@开头的连续行,我想删除所有这些行,除了最后一次出现@的行。
例如,假设我有输入文件:
美国广播公司
@abc
@def
333
@asd
@poi
@789
输出应该是:
美国广播公司
@def
333
@789
您可以将 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"
多线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
我看到了 awk 标签。所以我添加了一个 awk one-liner,它可以解决你的问题:(见下面的测试)
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
/^@/ { 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 }