想问下这个字符串处理的简单的小脚本怎么写(bash或者vim都好)?

比方说类似

my_fun("abc","defghi","jk");
my_fun("abcdefg","hijklmnop","q");

类似这样的文字,我想实现类似这样的对齐效果,就是不同行的逗号对齐.

my_fun("abc"    ,"defghi"   ,"jk");
my_fun("abcdefg","hijklmnop","q" );

以我想得到的脚本写法,大致就是先按照逗号切割字符串成字符串数组,然后统计每一列的最长长度,最后再把字符串数组拼回去,只不过拼回去前在它的尾部添加适当数量的空格...
感觉非常麻烦,我觉得这个需求应该有更灵活的实现.求问,有吗?bash,vim,awk之类的什么都好.

阅读 710
avatarAI BotBETA

在 Bash 中,你可以编写一个脚本来实现这个功能。以下是一个简单的 Bash 脚本示例,该脚本读取输入,并自动对齐逗号分隔的参数:

#!/bin/bash

# 初始化每列的最大长度数组
max_lengths=()

# 读取输入,直到遇到EOF(Ctrl+D)
while IFS=',' read -ra args; do
    # 遍历每个参数,更新或初始化最大长度
    for ((i=0; i<${#args[@]}; i++)); do
        # 去除参数两边的引号
        arg=${args[$i]//\"/}
        # 如果这是第一个参数或当前参数比已知的最大长度还长,则更新最大长度
        if ((i >= ${#max_lengths[@]})); then
            max_lengths[$i]=${#arg}
        elif (( ${#arg} > max_lengths[$i] )); then
            max_lengths[$i]=${#arg}
        fi
    done
done

# 再次读取输入以构建对齐后的输出
while IFS=',' read -ra args; do
    # 遍历每个参数,并在后面添加空格以对齐
    for ((i=0; i<${#args[@]}; i++)); do
        arg=${args[$i]}
        # 添加适当的空格以达到对齐效果
        printf -v padded_arg '%-*s' "${max_lengths[$i]}" "${arg//\"/}"
        # 打印参数,除了最后一个后面打印逗号,其他都打印逗号加空格
        if (( i < ${#args[@]}-1 )); then
            echo -n "$padded_arg,"
        else
            echo "$padded_arg"
        fi
    done
    echo  # 打印换行符,用于分隔不同行的输出
done

使用此脚本,你可以从标准输入读取格式化的字符串,或者从文件中读取,如下所示:

# 将此脚本保存为 align_function_calls.sh 并给予执行权限
chmod +x align_function_calls.sh

# 运行脚本,输入你的函数调用,按 Ctrl+D 结束输入
./align_function_calls.sh

然后,你可以逐行输入你的函数调用,最后按 Ctrl+D 发送 EOF 信号来结束输入。脚本会输出对齐后的结果。

如果你希望从文件中读取输入,可以重定向文件到脚本:

./align_function_calls.sh < input.txt

这里,input.txt 是包含你的函数调用列表的文件。

注意,这个脚本假定输入是正确格式化的,即每一行都包含相同数量的参数,并且参数是用逗号分隔的。它也假定参数不会包含换行符,且每个参数都被双引号包围。如果你的输入不符合这些假设,你可能需要调整脚本以适应你的具体情况。

2 个回答
#!/bin/bash

align_commas() {
  awk '
  BEGIN { FS="," }
  {
    # Split each line by commas and store each part in the parts array
    for (i = 1; i <= NF; i++) {
      parts[NR, i] = $i
      # Calculate the maximum length of each column
      if (length($i) > max[i]) {
        max[i] = length($i)
      }
    }
    num_lines = NR
    num_cols = NF
  }
  END {
    for (i = 1; i <= num_lines; i++) {
      for (j = 1; j <= num_cols; j++) {
        # Print each part with padding spaces to align commas
        printf "%-*s", max[j] + 1, parts[i, j]
        if (j < num_cols) {
          printf ","
        }
      }
      print ""
    }
  }
  ' "$1"
}

align_commas "input.txt"

将上述脚本保存为 align_commas.sh 文件。
将需要对齐的内容保存到 input.txt 文件中。
运行脚本:
bash align_commas.sh

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏