私の入力は次のとおりです。
entry1line1
entry2line1\
entry2line2\
entry2line3
entry3line1
これらの入力をAWKの配列として読み込み、埋め込み改行文字として処理したいと思います。それは可能ですか? GNU機能を使用しないことをお勧めします。
答え1
posix awkではgetlineを使うことができます
awk '{while(/\\$/){getline tmp;$0=$0"\n"tmp}print "<LINE>"$0"<LINE>"}' file
最後の行が終わる限り、次の行を追加し続けます\
。
<LINE>entry1line1<LINE>
<LINE>entry2line1\
entry2line2\
entry2line3<LINE>
<LINE>entry3line1<LINE>
Perlでも同様です。
perl -ne '$_.=<> while /\\$/;chomp;print "<LINE>$_<LINE>\n"' file
答え2
GNU awkを使う:
$ awk '{printf "%s%s%s","line=",$0,RT}' RS='[^\\\\]\n' text
line=entry1line1
line=entry2line1\
entry2line2\
entry2line3
line=entry3line1
ご覧のとおり、 で終わる行が\
次の行につながります。このためです記録区切り記号 RS
バックスラッシュではなく文字と改行文字で上書きされます。つまり、バックスラッシュ - 改行文字はレコード区切り文字ではありません。
ここでいくつかのトリックは、レコード区切り文字がレコードの最後の文字を占めるということです。ただし、文字は組み込み変数に保存されますRT
。プログラムを少し変更すると、$0
コードの先頭の値が修正され、問題が解決します。
$ awk '{$0=$0 substr(RT,1,1)} {print "line=",$0}' RS='[^\\\\]\n' text
line= entry1line1
line= entry2line1\
entry2line2\
entry2line3
line= entry3line1
RT
実際に観察されたレコード区切り文字全体を含みます。私たちの場合、これはレコードの最後の文字の後に改行文字があることを意味します。したがって、上記のコードでは、の最初の文字が末尾にsubstr
追加されます。RT
$0
答え3
レコード区切り文字を変更できます。POSIXawk
RS
POSIXは正規表現にすることができるかどうかを指定しません。
複数文字の RS 値を使用する未指定の動作は、レコード区切り文字の拡張正規表現に基づいて将来の可能な拡張を許可することです。歴史的な実装では、文字列の最初の文字を取り、他の文字は無視します。
ただし、ファイル全体を文字列として読み取るか(lessを選択してRS
)、を使用してgetline
行末を見て、必要に応じて結果を一緒にリンクすることができます。
答え4
これパールレシピPerlを使用してこれを行う方法の例があります。
<>
名前付きファイルハンドルの代わりに(stdinおよび/またはコマンドラインで引数として提供されるすべてのファイル名)を使用し、続行後に改行文字を保持するように\
(少し珍しい場合)例を調整しました。 common 連続した行を長い行として扱い、連続した行が連結されていないか空白文字で連結されない状況です。
perl -e '
$count=1;
while (defined($line = <>) ) {
chomp($line);
if ($line =~ s/\\$//) {
$line .= "\n" . <>;
redo unless eof();
}
# process full record in $line here
printf "%04i:\"%s\"\n\n", $count++,$line;
}' willdavies.txt
$line
コメントした後、必要なものは何でもできます# process full record...
。ゼロで埋められた行カウンタを使用して、各行を別々の段落として印刷することにしました。また、含まれている内容と含まれていない内容を$line
正確に確認できるように引用符を追加しました。$line
出力:
0001:"entry1line1"
0002:"entry2line1
entry2line2
entry2line3"
0003:"entry3line1"