特定の行を列挙する方法を知りたいです。この場合、括弧付きの行の後の行のみをリストします。
ソースファイル:file.txt
TITLE: hello world
SUBTITLE: document about hello world
[CONTENT 1]
That's a line
Another one
Row
[EXAMPLE]
Example line
[CONTENT 2]
A
B
C
Text, text, text....
望ましい結果:file.txt
TITLE: hello world
SUBTITLE: document about hello world
[CONTENT 1]
1 That's a line
2 Another one
3 Row
[EXAMPLE]
5 Example line
[CONTENT 2]
6 A
7 B
8 C
Text, text, text....
答え1
アッ解決策:
awk '/^\[.+\]/{ f=1 }f && $0~/^\w/{ $0=++c FS $0 }!NF{ f=0 }1' file
/^\[.+\]/{ f=1 }
- 括弧を使用して行を一致させ、f
フラグでマークします。f && $0~/^\w/{ $0=++c FS $0 }
- 「括弧を含む」行の後の行にカウンタ値を追加します。!NF{ f=0 }
- 空行と下行は無視します。 (f=0
- リバース動作を示すリセットフラグ)
出力:
TITLE: hello world
SUBTITLE: document about hello world
[CONTENT 1]
1 That's a line
2 Another one
3 Row
[EXAMPLE]
4 Example line
[CONTENT 2]
5 A
6 B
7 C
Text, text, text....
答え2
perl -pe 's/^/++$a.$"/e if /^\[/ ... /^$/ and /^(?!\[)./' file.txt
結果
TITLE: hello world
SUBTITLE: document about hello world
[CONTENT 1]
1 That's a line
2 Another one
3 Row
[EXAMPLE]
4 Example line
[CONTENT 2]
5 A
6 B
7 C
Text, text, text....
説明する
-p
ファイルを1行ずつ処理するオプション+自動印刷を有効にします。s/^/.../e
カウンターとスペースを前に追加します($"
デフォルト=リスト区切り記号=スペース)。/e
置換コマンドの修飾子は、RHS を評価する Perl コードとして処理し、結果を代替結果として配置します。- 置換は、次の正規表現を選択した場合にのみ発生します。
/^\[/ .. /^$/
=>開いた角かっこで始まる行から始まる行範囲を選択し、空白行が見つかった場合は範囲を終了します。- 範囲の境界を拒否する行を選択して、範囲をさらに具体化します。つまり、1 つ以上の文字があり、その行が開く角かっこで始まらない行と一致します。したがって、これら2つの条件が満たされている場合のみ交換が行われ、OTWラインはそのままリリースされます。
- 自動印刷オプションは最終的にその行を印刷します。