bash で各段落の先頭にテキストを挿入する方法

bash で各段落の先頭にテキストを挿入する方法

空白行で区切られた複数の段落を含むファイルがあります。技術的には、それらは段落ではなく、空白行で区切られたテキストのセクションにすぎません。

空白行に続く各行の最初の行に番号を挿入することで、段落に番号を付けたいと考えています。つまり、ファイルに次のように記述されているとします。

これはテキストです。
これはさらにテキストです。
さらに多くのテキスト!

これはセクション 2 のテキストです。
さらにテキストを少し。
要点は分かりますね...

こう言わせたいのです:

1これはテキストです
これはさらにテキストです
さらに多くのテキスト!

2これはセクション2のテキストです。
さらにテキストを少し。
要点は分かりますね...

答え1

bash 組み込みコマンドでこれを試してください:

#!/bin/bash

l=1                          # paragraph counter
echo -n $l                   # print paragraph counter without new line
while read x; do             # read current line from file, see last line
  if [[ $x == "" ]]; then    # empty line?
    echo                     # print empty line
    read x                   # read next line from file, see last line
    ((l++))                  # increment paragraph counter
    echo -n $l               # print paragraph counter without new line
  fi
  echo "$x"                  # print current line
done < file

答え2

一般的に、テキスト解析にシェルを使用すると非常に時間がかかり、面倒です。他のオプションをいくつか示します。

  1. 「段落モード」の Perl

    perl -00pe 's/^/$./' file 
    

    説明

    -00は、段落モードをオンにします。段落モードの「行」は、連続した段落で定義されます。\n\nは、s/^/$./行の先頭 ( ^) を現在の「行」(段落) 番号 に置き換えます$.。は-p、 で指定されたスクリプトを実行した後、入力ファイルの各行を印刷するように perl に指示します-e

  2. ぎこちない

    awk -vRS='\n\n' -vORS='\n\n' '{print NR$0}' file
    

    説明

    -vRS='\n\n'awk のレコード区切りを連続する改行文字に設定します。perl の段落モードと同様に、段落を「行」として扱います。次に、現在の行番号 ( NR) と現在の「行」を印刷するように指示します$0-vORS=は、出力レコード区切りを連続する改行に設定し、出力でも段落が空白行で区切られるようにします。これにより、出力の最後に 2 つの空行が追加されることに注意してください。これを回避するには、 を使用できますhead

    awk -v RS='\n\n' -vORS='\n\n' '{print NR$0}' file | head -n -2
    

比較のために、10MB のテスト ファイルでさまざまなソリューションを実行したときに、私のシステムでかかった時間を以下に示します。

$ time a.sh > /dev/null ## a.sh is Cyrus's solution

real    0m1.419s
user    0m1.308s
sys     0m0.104s

$ time perl -00pe 's/^/$./' file  > /dev/null 

real    0m0.087s
user    0m0.084s
sys     0m0.000s

$ time awk -v RS='\n\n' -vORS='\n\n' '{print NR$0}' file | head -n -2 >/dev/null

real    0m0.074s
user    0m0.056s
sys     0m0.020s

上記のように、perl と awk の両方のソリューションは、シェル アプローチよりも桁違いに高速です。

関連情報