0

テキストファイルがあります。@ で始まる連続する行が複数ある場合、@ で始まる行の最後の出現を除いて、これらすべての行を削除したいと思います。

たとえば、入力ファイルがあるとしましょう:

abc

@abc

@定義

333

@asd

@ポイ

@789

出力は次のようになります。

abc

@定義

333

@789

4

4 に答える 4

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"
于 2012-07-16T14:55:10.737 に答える
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
于 2012-07-16T16:25:28.153 に答える
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
于 2012-07-16T20:57:42.777 に答える
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 }
于 2012-07-16T14:55:28.320 に答える