パターンを検索し、3番目の空白行にテキストを追加します。

パターンを検索し、3番目の空白行にテキストを追加します。

パターンを検索してから、3 番目の空白行が見つかるまで、パターンの後ろの空白行を数え、その空白行にコンマとセミコロンを入れようとします。空白行の間に大量のデータがある場合や、空白行の間にテキストが1行しかない場合があります。

GROUP DIRECTORY CATEGORIES
datadata

Grouping Cat
datadata

datadata
this is the 3rd blank line

私は成功せずに次のことを試しました。どんな提案がありますか?

sed '/GROUP DIRECTORY CATEGORIES/,/^$/^$/^$/,;/' file1>file2
sed '/GROUP DIRECTORY CATEGORIES/$/$/$/,;/' file1>file2
sed '/GROUP DIRECTORY CATEGORIES/{$;$;$/./,;/1;}' file1>file2

答え1

sedこの目的に使用できますが、計算に関連するすべての操作はを使用して簡単に実行できますawk

このテストファイルを考えてみましょう。

$ cat file1
GROUP DIRECTORY CATEGORIES
datadata

Grouping Cat
datadata

datadata

Above is 3rd blank line

,;次の3番目の空白行にaを追加するにはGROUP DIRECTORY CATEGORIES

$ awk '/GROUP DIRECTORY CATEGORIES/{f=1}  f && /^$/ {f++; if (f==4) $0=",;"} 1' file1
GROUP DIRECTORY CATEGORIES
datadata

Grouping Cat
datadata

datadata
,;
Above is 3rd blank line

仕組み:

  • /GROUP DIRECTORY CATEGORIES/{f=1}

    正規表現に一致する行が見つかるたびに、GROUP DIRECTORY CATEGORIES変数はf1に設定されます。

  • f && /^$/ {f++; if (f==4) $0=",;"}

    0ではなくf現在の行が空の場合は1を/^$/追加しますf。 4の場合、f現在の空白行を,;

  • 1

    1awkのprint-the-lineの不思議な略語です。

答え2

基本的に、あなたの式はパターン空間として一度に1行だけ読み取られるので、アプローチは失敗します。したがって、適切な正規表現を構成できますが、2つ以上の空行と一致することはできません。

しかしそれははいNループ内のコマンドを使用して、複数の行をパターン空間として読み取ることができます。 GNU sedの複数行修飾子に加えて、改行は複数行のパターン空間でシーケンスとして表示されます。したがって、空白行をテストするには代わりに\n使用する必要があります。たとえば、次のようになります。\n\n^$

sed -E '
  /GROUP DIRECTORY CATEGORIES/ {
  :a                            # label the start of a loop
  $!N                            # if not at the end of file, read & append the next line
  s/((\n\n.*){2})\n\n/\1\n,;\n/ # match and capture 2 instances of successive newlines, 
                                # followed by a 3rd; if found, replace the 3rd by \n,;\n 
  t                             # branch out of the loop on successful replacement
  ba                            # else branch back to label 'a'
  }' file1

GNU sedでは、このt;baシーケンスをTa

答え3

この複雑なアドレス指定要件は、ex(またはvi)が実際に機能する場所です。

exPOSIX専用ツールviこれは(「ビジュアルエディタ」)の全身です。 Vimでは、すべてのスタイルコマンドを引き続き使用できることに注目する価値がありますexvi

Vimでドキュメントの先頭から最初のインスタンスを起動すると仮定すると、vi次のようになります。/pattern/

  • vi file.txtコマンドラインで入力してファイルを開きます。<Enter>

  • 前のコロンを含む次のように入力します。次にを押します<Enter>

    :0/GROUP DIRECTORY CATEGORIES//^$//^$//^$/s/^/,;/
    
  • :x変更を保存するには、入力してタップします<Enter>

上記のコマンドでは、小文字より前の内容sはすべて住所。このsコマンドは非常に明確でなければなりません。

アドレスは、「ファイルの先頭(行「0」)で始まり、「GROUP DIRECTORY CATEGORIES」の最初のインスタンス、そこから最初の空の行インスタンス、次の空の行インスタンス、次にコマンドを実行して代替コマンドを実行します。してください。」

それを分離する方法はいくつかあります。シングルライニングである必要はありません。

ex次のコマンドを使用してこの編集を実行することもできます。

0/GROUP DIRECTORY CATEGORIES/
/^$/
//
//
s//,;/
x

関連情報