Bash循环调用Sed合并6行文本未达预期输出,求技术支持
技术分析与解决思路
原命令的问题
- 循环逻辑完全错误:你用for循环重复执行sed命令,但每次sed都是直接读取原始的
temp.txt文件,没有将上一次的处理结果作为下一次的输入。也就是说,每次循环输出的都是同一个结果:
循环6次只会重复输出6遍上述内容,根本无法实现逐行累积合并的效果。line1 line2 line3 line4 line5 line6 line7 - sed命令本身的局限性:原sed命令
N;1s/\(.*\)\n\(.*\)/\1 \2/仅会将第一行和第二行的换行替换为空格,后续行完全不受影响,而且单次执行无法处理多行连续合并。
正确解决方法
方法一:用sed实现多行合并
利用sed的标签循环功能,一次性处理前6行的换行替换:
sed ':merge;N;1,5s/\n/ /;t merge' temp.txt
命令解释:
:merge:定义一个名为merge的标签,用于循环跳转N:将下一行读取到当前模式空间中1,5s/\n/ /:在第1到第5行的范围内(对应前6行的5个换行符),将换行符替换为空格t merge:如果上一步的替换操作成功,跳回merge标签继续执行,直到完成所有前6行的合并
方法二:用awk实现(更直观易读)
awk处理行号的逻辑更直接,只需判断行号决定输出空格还是换行:
awk '{printf "%s", $0 (NR < 6 ? " " : "\n")}' temp.txt
命令解释:
NR是awk内置变量,表示当前处理的行号- 前6行(NR<6)输出内容后加空格,第7行(NR=7)输出内容后加换行符
两种方法都能得到你预期的输出:
line1 line2 line3 line4 line5 line6 line7
内容的提问来源于stack exchange,提问作者John-L_.
相关产品推荐
相关产品推荐

