入力ファイル:
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
より携帯性が高く、安定して使用できます。