如何合并所有文本行?tr/paste/sed命令报错求助
解决文本行合并问题
先逐个拆解你遇到的命令失效原因,再给出可行的解决方案:
你的命令为什么没用?
tr '\n' ''报错:tr的替换模式要求第二个参数不能是空字符串(POSIX标准强制规定),你要的是删除换行符,而非替换,得用删除模式。paste -sd '' -报错:不同系统的paste实现有差异,比如BSD/macOS版的paste不允许直接传空字符串当分隔符,而你的环境刚好是这类系统。sed 's/\n//'无效:sed默认按单行处理,每行内部不存在换行符,这个替换规则根本碰不到行与行之间的换行。
可行解决方法
方法1:用tr删除换行符(最简洁通用)
直接用tr -d模式删除所有换行符,这是跨系统通用的写法:
echo 'one\ntwo' | tr -d '\n'
输出结果:onetwo
方法2:适配多系统的paste写法
如果要兼容BSD/macOS的paste,可以用空字符作为分隔符,GNUpaste也支持这个写法:
echo 'one\ntwo' | paste -sd '\0' -
Linux环境下的GNUpaste也可以直接用你最初的写法:paste -sd '' -
方法3:用sed跨行处理换行
通过sed的多行模式把所有内容读入后统一替换换行:
echo 'one\ntwo' | sed ':a;N;$!ba;s/\n//g'
逻辑::a定义循环标签,N读取下一行到当前缓冲区,$!ba非最后一行就循环读取,最后s/\n//g替换所有换行。
方法4:用awk无换行输出
利用awk的printf或者修改输出记录分隔符:
# 写法一 echo 'one\ntwo' | awk '{printf "%s", $0}' # 写法二(更简洁) echo 'one\ntwo' | awk -v ORS='' 1
方法5:用printf直接输出
借助命令替换把多行内容传给printf,让它无换行输出:
printf "%s" "$(echo 'one\ntwo')"
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

