たとえば、いくつかの改行を含むテキストを保持するシェル変数$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
を使用してこれを行う方法があるかどうかも疑問に思っています。
文字列の新しい行のみを削除する場合は、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
代わりにtr
を使用してみてください:
echo "$string" | tr '\n' ' '
さらにもう1つのオプションは、xargs
を使用することです(さらに、複数の空白を圧縮します)。
string="this
is
a test"
printf "$string" | xargs # this is a test
Echoは空白を無視するため、機能するはずです。
new_string=`echo $string`
あなたの例が示すように、すでにbash変数として文字列を持っている場合、sed
、awk
、printf
を呼び出すことは無意味であり、リソースの無駄です(そしてより多くのタイピング)。 、など... bash変数展開を使用できます:
string="${string//$'\n'/ }"
再度割り当てる必要はありません。展開をそのまま使用して、$string
変更なし。
printf "${string//$'\n'/ }" >file
この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.
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"
これは、シェル変数\n
inにある1つ以上の$string
ewline文字のシーケンスを単一の<space>
に変換します。
単純なsedコマンドを使用できます
$-sed ':loop;N;s/\n/ /g;t loop'