MST
星途 面试题库

面试题:Bash中nl命令结合其他工具的深度应用

在Bash环境下,有一个不规则格式的代码文件,文件中不同代码段用连续的三个#号分隔开。需要编写一个脚本,用nl命令给每个代码段内的行加上独立的行号(即每个代码段行号都从1开始),并且在每个代码段结束后插入一行注释记录该代码段的行数,最后将处理后的内容在终端以彩色形式显示(不同代码段颜色不同),你将如何完成这个任务?
32.3万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
#!/bin/bash

# 定义颜色数组
colors=("31" "32" "33" "34" "35" "36")
color_index=0

# 分割文件内容为代码段
IFS='###' read -ra code_segments < file.txt

for segment in "${code_segments[@]}"; do
    # 跳过空的代码段
    if [[ -z "$segment" ]]; then continue; fi
    
    # 使用nl命令添加行号
    numbered_segment=$(echo "$segment" | nl -b a -n rz)
    
    # 计算代码段行数
    line_count=$(echo "$numbered_segment" | wc -l)
    
    # 添加注释记录行数
    numbered_segment="$numbered_segment\n# Lines in this segment: $line_count"
    
    # 以彩色显示
    color_code="${colors[color_index]}"
    echo -e "\e[${color_code}m$numbered_segment\e[0m"
    
    # 切换颜色
    color_index=$(( (color_index + 1) % ${#colors[@]} ))
done
  1. 颜色定义:定义一个颜色数组colors,包含多种颜色代码,color_index用于追踪当前使用的颜色。
  2. 分割代码段:使用IFS='###'设置分隔符为###,并通过read -ra将文件内容读取到数组code_segments中。
  3. 处理每个代码段
    • 跳过空的代码段。
    • 使用nl -b a -n rz命令为代码段添加行号,-b a表示对所有行编号,-n rz表示行号格式为三位数字,不足三位前面补零。
    • 计算代码段行数,并添加注释记录行数。
    • 根据color_index从颜色数组中获取颜色代码,以彩色显示代码段,最后重置颜色。
    • 切换到下一个颜色。

假设代码文件名为file.txt,将上述脚本保存为一个可执行文件,运行该脚本即可完成任务。