web-dev-qa-db-ja.com

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

たとえば、いくつかの改行を含むテキストを保持するシェル変数$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を使用してこれを行う方法があるかどうかも疑問に思っています。

23

文字列の新しい行のみを削除する場合は、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
35
pferor

代わりにtrを使用してみてください:

echo "$string" | tr '\n' ' '
5
Mark McKinstry

さらにもう1つのオプションは、xargsを使用することです(さらに、複数の空白を圧縮します)。

string="this
    is 
a    test"

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

Echoは空白を無視するため、機能するはずです。

new_string=`echo $string`
3
Kevin

あなたの例が示すように、すでにbash変数として文字列を持っている場合、sedawkprintfを呼び出すことは無意味であり、リソースの無駄です(そしてより多くのタイピング)。 、など... bash変数展開を使用できます:

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

再度割り当てる必要はありません。展開をそのまま使用して、$string 変更なし。

printf "${string//$'\n'/ }" >file
3
Peter.O

この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.
3
Avinash Raj
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

これは、シェル変数\ninにある1つ以上の$stringewline文字のシーケンスを単一の<space>に変換します。

1
mikeserv

単純なsedコマンドを使用できます

 $-sed ':loop;N;s/\n/ /g;t loop'
0
Kalanidhi M.