次の行の最初の文字に基づいて行を連結します。

次の行の最初の文字に基づいて行を連結します。

次の行に基づいて遠隔連絡先の行を探しています。これまでに見た唯一の方法は、1行ずつ読み、次のことを行うシェルスクリプトを作成することです。

while read line
    if $line does not start with "," and $curr_line is empty 
        store line in curr_line
    if $line does not start with "," and $curr_line is not empty
        flush $curr_line to file
        store $line in $curr_line
    if $line starts with "," append to $curr_file, flush to file empty curr_line
done < file

だから私はこれがsedやgrepとリダイレクトを使って達成できるかどうかを理解しようとしています。このファイルのルールは簡単です。 「、」で始まる最大1行だけを前の行に追加するだけです。

前任者:

line0
line1
line2
,line3
line4
line5
,line6
line7
,line8
line9
line10
line11

結果ファイルは次のとおりです。

line0
line1
line2,line3
line4
line5,line6
line7,line8
line9
line10
line11

答え1

私はそれをします:

awk -v ORS= '
  NR>1 && !/,/ {print "\n"}
  {print}
  END {if (NR) print "\n"}' < file

つまり、現在の行が次から始まらない場合は、前の行を区切る改行文字のみが印刷されます,

いずれにせよ、while readループの使い方がわかりません。

答え2

sedこれはで説明されているような典型的なユースケースです。Sed 1行の説明、パート1:ファイル間隔、番号付け、テキスト変換および置換40. 前の行が等号「=」で始まる場合は、前の行の後に行を追加します。,(に対する明白な修正=

sed -e :a -e '$!N;s/\n,/,/;ta' -e 'P;D' file
line0
line1
line2,line3
line4
line5,line6
line7,line8
line9
line10
line11

答え3

あなたがしなければならないのは、ファイルを読んでコンマの前のすべての改行を削除することです。

$ perl -0777pe 's/\n,/,/g' file
line0
line1
line2,line3
line4
line5,line6
line7,line8
line9
line10
line11

答え4

これは完璧ユースケースex

聞いたことがない場合は、exYESの全身はvi次のようになりますviPOSIXで指定そして基本的にどこでも*使用可能*です。

ex実際にファイル用に設計されています編集するただし、変更を保存せずに使用することもできます。


ファイルに保存せずに変更を印刷する:

printf '%s\n' 'g/^,/-j!' %p | ex file.txt

変更してファイルに保存します。

printf '%s\n' 'g/^,/-j!' x | ex file.txt

説明する:

私はこのprintfコマンドをスクリプトファイルの編集のラッパーとして使用しますex。この形式の利点は、失敗した場合(たとえば、渡されたコマンドが実際のコマンドではないか、存在しない行番号を指定しようとした場合)、コマンドが終了するのではなく(変更を保存せずに)終了することです。追加の入力を待っています。

コマンド自体を実行すると、渡された正確なコマンドを表示できますprintfexprintf

$ printf '%s\n' 'g/^,/-j!' %p
g/^,/-j!
%p

さて、このコマンドは何をしますか?

「グローバル」コマンドは、正規表現と一致するg「バッファ」(ファイル)のすべての行で次のコマンドを実行します(行の先頭に続くコンマが続く)。^,

この例のコマンドはアドレスです-j!-これは、そのアドレスで次のコマンドを実行することを意味します。より早い現在の行に移動します。 (つまり、この行では今後カンマで始まる行。 )

j「結合」に使用され、この行を次の行と組み合わせます。感嘆符(!)は、元の行に関連付けられている行を区切るために空白文字を使用できないようにします。

%は「フルバッファ」を意味するアドレスで、p「印刷」を意味します。

x変更を保存して終了することを示します。

私が言ったように、これは完璧ユースケースex


*ウィンドウを除く。 :血

関連情報