2

ファイルから #SOF から #EOF までの行を取得する方法

in source.sh
#SOF
"Lorem ipsum dolor sit amet"
"Vivamus pretium enim"
"Est accumsan enim magnis"
#EOF

#SOF
"Eleifend tincidunt id justo"
"Tellus ut tincidunt vel ac a orci"
"Sapien Nullam Sed nunc"
"Vestibulum est accumsan enim"
#EOF

#SOF
"Consequat mauris mollis montes"
#EOF

3つのファイルを取得する必要があります

in target_1.sh
"Lorem ipsum dolor sit amet"
"Vivamus pretium enim"
"Est accumsan enim magnis"

in target_2.sh
"Eleifend tincidunt id justo"
"Tellus ut tincidunt vel ac a orci"
"Sapien Nullam Sed nunc"
"Vestibulum est accumsan enim"

in target_3.sh
"Consequat mauris mollis montes"

やり方誰か教えて?ご協力ありがとうございました

4

3 に答える 3

4

でそれを行うことができます:

awk '/^#EOF$/ {do_print=0}
     do_print {print > ("target_"f_index".sh")}
     /^#SOF$/ {do_print=1; f_index++}' source.sh

入出力:

  • 問題に示されている例に一致します。

説明:

  • awk '...': テキスト ファイルを 1 行ずつ操作するためのツールである awk を呼び出します。一重引用符のセットで囲まれた命令は awk に与えられます。
  • /^#EOF$/ {do_print=0}:^は「行頭」の正規表現アンカーであり、$「行末」のアンカーです。ここで言っている#EOFのは、行に 1 つしかない場合は、印刷フラグをオフにするということdo_printです。
  • do_print {print > ("target_"f_index".sh")}: これは、awk によって解析されるすべての行に対して実行されます。フラグが設定されている場合は、do_printで指定されたインデックスを持つ出力ファイルに行を追加しますf_index
  • /^#SOF$/ {do_print=1; f_index++}: 同様に#SOF、行にしか表示されない場合は、印刷フラグをオンにして、f_indexを 1 増やします。
  • これらの最後の 3 つが各行に対して評価されることに注意してください。そのため、最初に EOF を探し、該当する場合はその行を出力し、その後で SOF を探します -#EOFまたはを出力したくありません#SOF
  • source.sh: に入力ファイルの名前を指定しますawk。猫を救う。
于 2012-12-09T18:55:14.273 に答える
4

はそれを優雅に行います:

awk '
    /^#EOF/{l=0}
    l {
        print > "target_" file ".sh"
    }
    /^#SOF/{l=1;file++}
' source.sh

処理後

$ ls -1t target_*
target_1.sh
target_2.sh
targer_3.sh

説明

  • l {}isはtrue の式if (l==1) {}であるため、と同じです1awk
于 2012-12-09T18:56:46.783 に答える
0

(唯一のタグ)のみを使用する場合は、次のようにしてみてください。

#!/bin/bash
c=0
while read a; do
    if [[ $a =~ ^#SOF ]]; then
        l=1
        ((file++))
    fi

    [[ $a =~ ^#EOF ]] && l=0

    if [[ ! $a =~ ^#SOF ]] && ((l==1)); then
        echo $a >> "target_${file}.sh"
    fi
done < input_file
于 2012-12-09T19:23:00.813 に答える