パターンを検索してから、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
変数はf
1に設定されます。f && /^$/ {f++; if (f==4) $0=",;"}
0ではなく
f
現在の行が空の場合は1を/^$/
追加しますf
。 4の場合、f
現在の空白行を,;
。1
1
awkの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
)が実際に機能する場所です。
ex
はPOSIX専用ツールvi
これは(「ビジュアルエディタ」)の全身です。 Vimでは、すべてのスタイルコマンドを引き続き使用できることに注目する価値がありますex
。vi
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