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

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

答え1

文字列から新しい行のみを削除するために使用する必要はありませんsed

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

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

ただし、ファイルの新しい行を空白に変換するには、sed次のようにします。

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

# for a string
$ new_string="$(echo "$string" | sed ':a;N;$!ba;s/\n/ /g')"

でもawk:

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

答え2

別のオプションは、次のものを使用することですxargs(また、複数のスペースを圧縮します)。

string="this
    is 
a    test"

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

答え3

例のように、すでに文字列を bash 変数として持っている場合、 、 などを呼び出すことはsed意味awkprintfなく、リソースの無駄(およびより多くの入力)です。bash変数の拡張:

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

再割り当てする必要もありません。拡張機能をそのまま使用し、$string変更せずにそのままにすることができます。

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

答え4

この 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.

関連情報