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


22

假设我有一个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


Answers:


32

如果您只想删除字符串中的新行,则无需使用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

1
sponge是用于覆盖输入文件的有用实用程序。它是包装的一部分moreutilsawk '$1=$1' ORS=' ' file |sponge file
Peter.O 2011年

@ferer感谢您提供信息。正在安装moreutils...
pferor 2011年


4

另一个选择是使用xargs(另外,它会挤压多个空格):

string="this
    is 
a    test"

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

3

回声忽略空白,因此它应该工作:

new_string=`echo $string`

是的,它会起作用,可能效果很好。它将多个空格折叠为一个空格。这包括将TAB转换为空格。
Peter.O 2011年

3

如果你已经有了字符串作为bash的变量,因为你的例子显示,这是毫无意义的,浪费资源(多输入)的调用sedawkprintf,等...你可以使用bash的变量扩展

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

您甚至不必重新分配它。您可以按原样使用扩展,并且$string保持不变。

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

3

您也可以尝试使用该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.

1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

这会将\nshell变量中出现的一个或多个ewline字符的任何序列$string转换为单个<space>


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.