バックスラッシュ文字で終わるすべての行を結合する方法は?

バックスラッシュ文字で終わるすべての行を結合する方法は?

sedやawkなどの一般的なコマンドラインツールを使用して、バックスラッシュなどの特定の文字で終わるすべての行を連結できますか?

たとえば、次のファイルがあるとします。

foo bar \
bash \
baz
dude \
happy

私は次のような出力を得たいと思います。

foo bar bash baz
dude happy

答え1

より短くて簡単なsedソリューション:

sed  '
: again
/\\$/ {
    N
    s/\\\n//
    t again
}
' textfile

GNUを使用している場合は1行sed

sed ':x; /\\$/ { N; s/\\\n//; tx }' textfile

答え2

おそらくPerlを使用するのが最も簡単です(Perlはsedとawkに似ているので、これを受け入れてください)。

perl -p -e 's/\\\n//'

答え3

これはawkソリューションです。行が終わったら、\バックスラッシュを削除し、改行なしで行を印刷します。それ以外の場合は、改行を使用して行を印刷します。

awk '{if (sub(/\\$/,"")) printf "%s", $0; else print $0}'

sedの状況はそれほど悪くありませんが、awkは確かにより読みやすくなります。

答え4

別の一般的なコマンドラインツールは、デフォルトでedファイルを内部で変更するため、ファイル権限を変更しません(詳細については、ed以下を参照してください)。スクリプト内の編集テキストエディタを使用したファイルの編集)

str='
foo bar \
bash 1 \
bash 2 \
bash 3 \
bash 4 \
baz
dude \
happy
xxx
vvv 1 \
vvv 2 \
CCC
'

# We are using (1,$)g/re/command-list and (.,.+1)j to join lines ending with a '\'
# ?? repeats the last regex search.
# replace ',p' with 'wq' to edit files in-place
# (using Bash and FreeBSD ed on Mac OS X)
cat <<-'EOF' | ed -s <(printf '%s' "$str")
H
,g/\\$/s///\
.,.+1j\
??s///\
.,.+1j
,p
EOF

関連情報