如何用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/ $//'
思路解释:
(.*?):非贪婪匹配任意字符(直到遇到第一个x_y_),捕获为第一个分组;(x_y_):捕获目标标记字符串为第二个分组;\2 \1:调换两个分组的顺序,把x_y_放到前面;- 最后用
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
思路解释:
-F 'x_y_':把x_y_设为字段分隔符,原字符串会被拆分为多段内容;- 遍历每一段非空内容,给每段前面加上
x_y_; - 用
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"
思路解释:
- 用
IFS='x_y_'和read -ra把原字符串拆分成数组; - 遍历数组中的每一段内容,清理空格后拼接到结果中,每段前面加上
x_y_; - 最后去掉结果末尾多余的空格,输出最终内容。
内容的提问来源于stack exchange,提问作者TempoChocolate
相关产品推荐
相关产品推荐

