假设我有一个 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 变量,如您的示例所示,则调用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.