結果

結果

特定の行を列挙する方法を知りたいです。この場合、括弧付きの行の後の行のみをリストします。

ソースファイル: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ラインはそのままリリースされます。
  • 自動印刷オプションは最終的にその行を印刷します。

関連情報