使用Awk/Sed提取行中FSR开头片段的技术求助
当然可以!用 Awk 或者 Sed 都能轻松实现这个需求,而且写法相当简洁,我给你分别演示两种方案:
用 Awk 实现
Awk 的循环匹配功能可以精准捕获每行里所有以 FSR 开头的片段,逻辑清晰易懂:
awk '{ result = "" # 循环匹配所有 FSR 开头的片段(假设片段由非空白字符组成,可按需调整正则) while (match($0, /FSR[^[:space:]]+/)) { # 用 | 拼接结果,避免开头或末尾出现多余分隔符 result = result (result ? "|" : "") substr($0, RSTART, RLENGTH) # 截掉已经处理过的部分,继续匹配剩余内容 $0 = substr($0, RSTART + RLENGTH) } print result }' your_file.txt
逻辑说明:
match($0, /FSR[^[:space:]]+/)会找到当前行中第一个以FSR开头、后续跟着非空白字符的片段- 每次匹配到后,将片段追加到结果字符串中,并用
|分隔(第一次拼接时不会加多余的分隔符) - 截掉已处理的部分后继续循环,直到所有片段都被捕获
- 最后打印每行的拼接结果
用 Sed 实现
如果是 GNU Sed(大部分 Linux 系统默认是这个),可以用全局替换配合简单的清理操作快速完成:
-E ' # 全局替换:把所有非 FSR 开头的内容连同找到的 FSR 片段替换成「片段|」 s/[^F]*(FSR[^[:space:]]+)/\1|/g # 去掉末尾多余的 | s/|$// ' your_file.txt
逻辑说明:
s/[^F]*(FSR[^[:space:]]+)/\1|/g会遍历每行,跳过所有非F开头的内容,找到第一个FSR片段后替换成「片段|」,全局执行这个操作- 最后用
s/|$//移除行尾多余的分隔符 - 如果你的 Sed 不支持
-E(比如 BSD Sed),可以把正则里的括号转义成\(和\)
注意事项
如果你的 FSR 片段结束条件不是「非空白字符」(比如是直到遇到逗号、分号等特定符号),只需要调整正则里的 [^[:space:]] 部分即可:
- 比如片段直到逗号结束:
/FSR[^,]+/ - 比如片段包含字母数字下划线:
/FSR\w+/
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

