次の行に基づいて遠隔連絡先の行を探しています。これまでに見た唯一の方法は、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
。
聞いたことがない場合は、ex
YESの全身はvi
次のようになりますvi
。POSIXで指定そして基本的にどこでも*使用可能*です。
ex
実際にファイル用に設計されています編集するただし、変更を保存せずに使用することもできます。
ファイルに保存せずに変更を印刷する:
printf '%s\n' 'g/^,/-j!' %p | ex file.txt
変更してファイルに保存します。
printf '%s\n' 'g/^,/-j!' x | ex file.txt
説明する:
私はこのprintf
コマンドをスクリプトファイルの編集のラッパーとして使用しますex
。この形式の利点は、失敗した場合(たとえば、渡されたコマンドが実際のコマンドではないか、存在しない行番号を指定しようとした場合)、コマンドが終了するのではなく(変更を保存せずに)終了することです。追加の入力を待っています。
コマンド自体を実行すると、渡された正確なコマンドを表示できますprintf
。ex
printf
$ printf '%s\n' 'g/^,/-j!' %p
g/^,/-j!
%p
さて、このコマンドは何をしますか?
「グローバル」コマンドは、正規表現と一致するg
「バッファ」(ファイル)のすべての行で次のコマンドを実行します(行の先頭に続くコンマが続く)。^,
この例のコマンドはアドレスです-j!
。-
これは、そのアドレスで次のコマンドを実行することを意味します。より早い現在の行に移動します。 (つまり、この行では今後カンマで始まる行。 )
j
「結合」に使用され、この行を次の行と組み合わせます。感嘆符(!
)は、元の行に関連付けられている行を区切るために空白文字を使用できないようにします。
%
は「フルバッファ」を意味するアドレスで、p
「印刷」を意味します。
x
変更を保存して終了することを示します。
私が言ったように、これは完璧ユースケースex
例
*ウィンドウを除く。 :血