如何按空格分割行但保留单引号内内容并提取指定字段?
处理带单引号内空格的文本字段分割与转换方案
cut命令无法识别单引号作为字段边界,所以需要用更灵活的工具处理,以下是两种可行方案:
方案一:使用awk脚本(推荐)
awk能自定义字段分割逻辑,完美处理单引号内的空格,同时完成内容转换需求。
脚本示例
假设你的输入文件是input.txt,执行以下命令:
awk -v q="'" ' { n = 0 in_quote = 0 current = "" # 遍历所有字段,合并单引号内的内容 for (i=1; i<=NF; i++) { if ($i ~ "^" q) { in_quote = 1 current = $i } else if (in_quote && $i ~ q "$") { current = current " " $i in_quote = 0 field[++n] = current } else if (in_quote) { current = current " " $i } else { field[++n] = $i } } # 处理字段并输出 for (i=1; i<=n; i++) { # 跳过指定字符串 if (field[i] == "PASSED" || field[i] == "1440] took") { continue } # 移除ms后缀 if (field[i] ~ /[0-9]+ms$/) { sub(/ms$/, "", field[i]) } printf "%s%s", field[i], (i==n ? "\n" : " ") } } ' input.txt
工作原理
- 合并单引号内字段:遍历每行的每个字段,判断是否处于单引号包裹状态,将引号内的多段内容合并为一个完整字段
- 过滤指定内容:直接跳过
PASSED和1440] took字段 - 处理时间单位:用正则匹配结尾为
ms的数字字段,移除后缀ms - 输出结果:将处理后的字段用空格分隔输出
方案二:使用sed(适合简单场景)
如果你的文本格式固定,也可以用sed的正则替换完成需求,示例如下:
sed -E "s/PASSED //; s/ 1440] took //; s/([0-9]+)ms/\1/g" input.txt
注意事项
- 该方案依赖文本格式固定,比如
PASSED和1440] took的位置和前后空格规则不变 - 若单引号内的内容包含
ms,此方案会误替换,所以仅适合单引号内容不含目标替换字符串的场景
内容的提问来源于stack exchange,提问作者user21242972
相关产品推荐
相关产品推荐

