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

如何用sed、awk或Bash工具实现x_y_与前置内容的顺序调换?

解决方案:调换x_y_与前置内容的顺序

这需求不难,用sed、awk或者纯Bash都能搞定,我给你几个靠谱的方案:

方法一:使用GNU Sed

Sed 擅长文本替换,这里我们可以用非贪婪正则匹配捕获每组内容和对应的x_y_,然后调换它们的顺序:

sed -E 's/(.*?)(x_y_)/\2 \1/g' input.txt | sed 's/ $//'

思路解释:

  1. (.*?):非贪婪匹配任意字符(直到遇到第一个x_y_),捕获为第一个分组;
  2. (x_y_):捕获目标标记字符串为第二个分组;
  3. \2 \1:调换两个分组的顺序,把x_y_放到前面;
  4. 最后用sed 's/ $//'去掉结果末尾多余的空格。

方法二:使用Awk

Awk 适合按分隔符处理文本,我们可以把x_y_作为分隔符拆分原字符串,再重新拼接成目标格式:

awk -F 'x_y_' '{
    result = ""
    for(i=1; i<NF; i++) {
        # 去掉字段前后的空格
        gsub(/^ +| +$/, "", $i)
        if ($i != "") {
            result = result "x_y_ " $i " "
        }
    }
    # 移除末尾多余空格
    gsub(/ +$/, "", result)
    print result
}' input.txt

思路解释:

  1. -F 'x_y_':把x_y_设为字段分隔符,原字符串会被拆分为多段内容;
  2. 遍历每一段非空内容,给每段前面加上x_y_;
  3. 用gsub处理掉多余的空格,最后输出整理后的结果。

方法三:纯Bash脚本实现

如果不想依赖外部工具,用Bash的字符串处理和数组也能完成:

# 假设原字符串存储在变量中(也可以从文件读取)
original_str="a b c x_y_ d e f x_y_ g h i x_y_ k l m x_y_"

# 按x_y_拆分字符串为数组
IFS='x_y_' read -ra parts <<< "$original_str"

result=""
for part in "${parts[@]}"; do
    # 去掉当前段前后的空格
    trimmed_part=$(echo "$part" | xargs)
    if [[ -n "$trimmed_part" ]]; then
        result+="x_y_ $trimmed_part "
    fi
done

# 移除结果末尾的空格
result=${result% }
echo "$result"

思路解释:

  1. 用IFS='x_y_'和read -ra把原字符串拆分成数组;
  2. 遍历数组中的每一段内容,清理空格后拼接到结果中,每段前面加上x_y_;
  3. 最后去掉结果末尾多余的空格,输出最终内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:08