0

これはおそらく非常に難しいこと、または不可能なことです...

ファイル内のすべての段落を調べて、それぞれに特定のフレーズが含まれているかどうかを確認する必要があります。フレーズが含まれていない場合は、行を追加する必要があります (たとえば、段落の 4 行目)。

次に例を示します。

[Paragraph Name]
Entry1 = foo
Entry2 = bar
Entry3 = foo
Entry4 = bar
Entry6 = foo
Entry7 = bar
Entry10 = foo

[Another Paragraph Name]
Entry1 = foo
Entry2 = bar
Entry4 = bar
Entry8 = foo

次のようになります。

[Paragraph Name]
Entry1 = foo
Entry2 = bar
Entry3 = foo
Entry4 = bar

Entry6 = foo
Entry7 = bar


Entry10 = foo

[Another Paragraph Name]
Entry1 = foo
Entry2 = bar

Entry4 = bar



Entry8 = foo

各行の順序は決して変更されません (エントリ 1 は、両方が存在すると仮定すると、常にエントリ 2 の前に来ます)。段落ごとに 14 行あり、それぞれをチェックする必要があります (常にそこにあるタイトルを除いて - 実際に行方不明になる可能性があるのは 13 行だけです)。

読んでくれてありがとう、これが不可能だとわかっているなら、言ってください:)

4

3 に答える 3

0

ここでそれを行う別の方法がありますawk

awk -F"Entry| " '/^\[|^$/ {f=1;print;next} {for (i=f;i<=$2;i++) if (i==$2) {print} else {print "";f++};f++}' file
[Paragraph Name]
Entry1 = foo
Entry2 = bar
Entry3 = foo
Entry4 = bar

Entry6 = foo
Entry7 = bar


Entry10 = foo

[Another Paragraph Name]
Entry1 = foo
Entry2 = bar

Entry4 = bar



Entry8 = foo

それはどのように機能しますか:

awk -F"Entry| " '               # Sets the Field Separator to "Entry" or " " (Makes it easy to get the number)
    /^\[|^$/ {                  # Run this only if line starts with "[" or is a blank line (^$)
        f=1                     # Set counter to 1
        print                   # Print the line
        next                    # Skip to next record
    }
        {                       # This section is run on all "Entry" lines
        for (i=f;i<=$2;i++)     # Create a loop going from counter f to the number stored in Entry
            if (i==$2) {        # If these two numbers are equal, then:
                print           # print the line
                } 
            else {              # If not equal, then:
                print ""        # print a blank line
                f++             # increase counter
            }
        f++                     # increase counter for every line
    }' file 
于 2013-11-20T09:41:33.037 に答える