shell 使用sed从传入流中删除新行字符

mznpcxlj  于 2022-12-30  发布在  Shell
关注(0)|答案(3)|浏览(154)

我是shell脚本的新手,我正在尝试使用SED从每行中删除新的行字符。这是我目前所做的:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g'

只删除第一个换行符。我在某处找到了这个命令:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g'

但是它给出:“ba:未找到事件。”
如果我这样做:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g'

然后它给出正确的输出,但我正在寻找更好的东西,因为我不确定有多少新的字符,我会得到当我运行脚本。传入流是从回声或printf或脚本中的一些变量。

idfiyjo8

idfiyjo81#

要删除换行符,请使用tr:

tr -d '\n'

如果要将每个换行符替换为单个空格:

tr '\n' ' '

错误ba: Event not found来自csh,这是由于csh试图匹配历史列表中的!ba。您可以转义!并编写以下命令:

sed ':a;N;$\!ba;s/\n/ /g'  # Suitable for csh only!!

但是sed是一个不合适的工具,你最好使用一个能更合理地处理带引号的字符串的shell,也就是说,停止使用csh,开始使用bash。

jjjwad0x

jjjwad0x2#

这可能对你有用:

printf "{new\nto\nlinux}" | paste -sd' '            
{new to linux}

或:

printf "{new\nto\nlinux}" | tr '\n' ' '            
{new to linux}

或:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g'
{new to linux}
qrjkbowd

qrjkbowd3#

使用perl代替sed。perl与sed类似:

ubuntu@ubuntu:/$ printf "{new\nto\nlinux}" | sed 's/\n/ /g'; echo ''
{new
to
linux}
ubuntu@ubuntu:/$ printf "{new\nto\nlinux}" | perl -pe 's/\n/ /g'; echo ''
{new to linux}
ubuntu@ubuntu:/$ echo -e "new\nto\nlinux\ntest\n1\n2 3" | perl -pe 's/\n/_ _/g'; echo ''
new_ _to_ _linux_ _test_ _1_ _2 3_ _
ubuntu@ubuntu:/$

相关问题