テキストファイルがあります。@ で始まる連続する行が複数ある場合、@ で始まる行の最後の出現を除いて、これらすべての行を削除したいと思います。
たとえば、入力ファイルがあるとしましょう:
abc
@abc
@定義
333
@asd
@ポイ
@789
出力は次のようになります。
abc
@定義
333
@789
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"
複数行の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ワンライナーを追加します:(以下のテストを参照)
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 }