sedを使用して改行をスペースに変換する


22

$stringいくつかの改行を含むテキストを保持するシェル変数があるとします。たとえば:

string="this
is 
a test"

この文字列を、new_stringすべての改行がスペースに変換される新しい文字列に変換したいと思います。

new_string="this is a test"

私は試した:

print $string | sed 's/\n/ /g'

しかし、それはうまくいきませんでした

またperl -0777 's/\n/ /g'、コマンドを使用してこれを行う方法があるのだろうかと思ってい trますか?


回答:


32

文字列内の新しい行のみを削除する場合は、を使用する必要はありませんsed。あなただけを使用することができます

$  echo "$string" | tr '\n' ' '

他の人が指摘したように。

ただし、を使用してファイルの新しい行をスペースに変換する場合はsed、次を使用できます。

$ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks

またはawk

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces

1
sponge入力ファイルを上書きするための便利なユーティリティです。それはパッケージの一部ですmoreutils...例えば。 awk '$1=$1' ORS=' ' file |sponge file
Peter.O

@ferer情報をありがとう。インストールmoreutils...
pferor


4

さらに別のオプションは、使用することですxargs(さらに、複数の空白を絞ります)。

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test

3

Echoは空白を無視するため、動作するはずです。

new_string=`echo $string`

はい、機能しますが、おそらくうまくいきます。複数の空白を単一のスペースに折りたたみます。TABをスペースに変換することも含まれます。
Peter.O

3

あなたはすでにあなたの例が示すように、bashの変数として文字列を持っている場合、それは資源の無意味かつ無駄である(そしてもっとタイピング)の呼び出しにsedawkprintf、など...あなただけ使用することができますbashの変数展開を

string="${string//$'\n'/ }"

再割り当てする必要さえありません。展開をそのまま使用し、$string変更せずに残すことができます。

printf "${string//$'\n'/ }" >file

3

このawkコマンドも試すことができますが、

awk -v RS="" '{gsub (/\n/," ")}1' file

例:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.

1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

これ\nにより、シェル変数で発生する1つ以上のewline文字のシーケンスが$string単一の<space>


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.