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}'
答え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