$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
意味awk
がprintf
なく、リソースの無駄(およびより多くの入力)です。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.