You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按空格分割行但保留单引号内内容并提取指定字段?

处理带单引号内空格的文本字段分割与转换方案

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

工作原理

  1. 合并单引号内字段:遍历每行的每个字段,判断是否处于单引号包裹状态,将引号内的多段内容合并为一个完整字段
  2. 过滤指定内容:直接跳过PASSED和1440] took字段
  3. 处理时间单位:用正则匹配结尾为ms的数字字段,移除后缀ms
  4. 输出结果:将处理后的字段用空格分隔输出

方案二:使用sed(适合简单场景)

如果你的文本格式固定,也可以用sed的正则替换完成需求,示例如下:

sed -E "s/PASSED //; s/ 1440] took //; s/([0-9]+)ms/\1/g" input.txt

注意事项

  • 该方案依赖文本格式固定,比如PASSED和1440] took的位置和前后空格规则不变
  • 若单引号内的内容包含ms,此方案会误替换,所以仅适合单引号内容不含目标替换字符串的场景

内容的提问来源于stack exchange,提问作者user21242972

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:51:56