入力ファイル:
1 line1\
2 line2\
3 line3\
4 \
5 line4\
6 \
7 \
8 line5\
希望の出力:
1 line1
2 line2
3 line3
4
5 line4
6
7 line5
POSIXは大丈夫ですed
か?
末尾のバックスラッシュを削除するのは簡単ですが、予想される出力で連続した黒いスラッシュをどのように処理できますか?
答え1
これにより、sed
次のことができます。
sed 's/\\$//;/./,/^$/!d'
(他の時代の構文に加えて)主な問題の1つed
は、スクリプトのエラー処理です。
ed
デフォルトでは、ファイルの編集に成功した場合は、成功を返したものとして処理する必要があります。ただし、編集を成功させるには、すべてのコマンドアドレスを有効にし、すべてのコマンドが成功する必要があります。たとえば、コマンドの場合、s
これは少なくとも1つの置換が完了したことを意味します。
したがって、この場合、編集が成功したことを確認するのは難しいかもしれません。
@Sukminderのソリューションに基づいて特別なケースを扱うには、次のように書くことができます。
printf '%s\n' a a . 'g/\\$/s///' ',s/^/a/' 'g/^a$/+1,/./s/^a$//' \
'v/./d' 'g/^a/s///' '$d' w | ed -s the-file
g
ファイルが空の場合、コマンドは失敗します(デフォルトのアドレス範囲()が無効であるため、最初にコマンドを1,$
使用してファイルの末尾に行を追加する必要があります。a
次の行()がある場合にのみ実行します。,s/\\$//
\
g/\\$/s///
ここでは、「xx」を挿入する代わりに(入力に見つからないと仮定して)、各行の前に「a」を追加し、削除する行を後で削除される空行に置き換えます。
ed
ファイルに書き込めない場合(コマンドが失敗した場合)、スクリプトがゼロ以外の終了状態のみを返すことを願っています。残念ながら、FSがいっぱいになったときにファイルを書き込めなかったときに、いくつかの実装が成功を返すのをw
見ました。ed
IMOはed
避けるのが最善です。今日では、perl -pi.back
より携帯性が高く、安定して使用できます。
答え2
一度にこれを行う方法がわかりません。ただし、内容がよく知られている場合は、二重行に一意の文字列を追加できます。
# Add XX to lines that should be deleted
g/^$/+1s/^$/XX/
# Delete them
g/XX/d
しかし、あまり良くありません。