grep工具使用问题:合并单行单词与后续行内容
解决单行姓名与下一行合并的问题
你的问题在于grep虽然擅长模式匹配,但处理这种需要动态判断行内容并合并的场景,它的能力有限——你用的grep -ozP命令因为-z把整个文件当作单一字符串,^\w+\n\w.+只会匹配文件最开头的单个单词+下一行,后续的孤立单行因为不是“整个字符串的开头”,所以无法被捕获。
更合适的工具是awk或者sed,这里给你两个实用的方案:
方案一:使用Awk(推荐,逻辑清晰易维护)
这个脚本会根据每行的字段数判断是否需要合并:
awk ' NR == 1 { prev = $0; next } NF == 1 { prev = prev " " $0 } NF > 1 { print prev; prev = $0 } END { print prev } ' your_file.txt
逻辑解释:
NR == 1:第一行直接存入变量prev,跳过后续处理NF == 1:如果当前行只有1个字段(孤立的单行单词),就把它拼接到prev后面NF > 1:如果当前行是完整的姓名(多个字段),先打印之前累积的prev,再把当前行设为新的prevEND:脚本结束时打印最后剩下的prev,避免遗漏文件末尾的内容
测试你的输入例子,会输出:
Alice Smith Bob Doolittle Mark Von Doe
方案二:使用Sed(单行命令,适合快速执行)
如果喜欢单行命令,可以用sed的循环匹配替换:
逻辑解释:
:a:定义一个循环标签aN:读取下一行到当前模式空间(把两行合并成一个处理单元)/^\w\+\n\w/:匹配“单行单词 + 换行 + 任意单词开头”的模式s/\n/ /:把匹配到的换行符替换成空格ta:如果替换成功,跳回标签a继续处理(比如如果下一行还是单行单词,会继续合并)P:打印模式空间的第一部分(直到换行)D:删除模式空间的第一部分,进入下一次循环
这两个方案都能完美处理你遇到的情况,比grep更适合这种行合并的场景。
内容的提问来源于stack exchange,提问作者Plouf
相关产品推荐
相关产品推荐

