使用 sed 将换行符转换为空格

使用 sed 将换行符转换为空格

假设我有一个 shell 变量$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 变量,如您的示例所示,则调用sedawkprintf等毫无意义且浪费资源(以及更多打字)...您可以使用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.

相关内容