【问题标题】:Unable to output values in the required format using shell script无法使用 shell 脚本以所需格式输出值
【发布时间】:2018-06-09 08:01:02
【问题描述】:

我需要将数组输出到以下格式的文件中。

File: a.txt
      b.txt

我尝试执行以下操作:

declare -a files=("a.txt" "b.txt")
empty=""
printf "File:" >> files.txt
for i in "${files[@]}"
do 
   printf "%-7s %-30s \n" "$empty" "$i" >> files.txt
done 

但是,我得到的输出为

 File: a.txt
 b.txt

谁能帮我得到所需格式的输出。

【问题讨论】:

    标签: bash shell format printf echo


    【解决方案1】:
    #!/bin/bash
    
    files=( 'a.txt' 'b.txt' 'c.txt' 'd.txt' )
    
    set -- "${files[@]}"
    
    printf 'File: %s\n' "$1"
    shift
    printf '      %s\n' "$@"
    

    输出:

    File: a.txt
          b.txt
          c.txt
          d.txt
    

    这利用了printf 将对其所有其他命令行参数重用其格式化字符串这一事实。

    我们将位置参数设置到列表中,然后输出带有File: 字符串前缀的第一个元素。然后,我们将$1 移出位置参数列表,并在插入间隔字符串的情况下打印其余部分。

    【讨论】:

      【解决方案2】:

      使用sed

      #!/bin/bash
      
      declare -a files=("a.txt" "b.txt")
      
      for i in "${files[@]}"
      do
         echo "$i" >> files.txt
      done
      sed -i '1 s/^/File: /' files.txt
      sed -i '1 ! s/^/      /' files.txt
      

      如果你使用的是Mac,你必须这样修改sed命令

      sed -i '' '1 s/^/File: /' files.txt
      sed -i '' '1 ! s/^/      /' files.txt
      

      输出将是:

      File: a.txt
            b.txt
      

      首先我们将所有文件名(for loop)放入txt文件。之后,通过第一个sed 命令我们将File: 添加到第一行,通过第二个sed 命令我们添加到所有行,除了第一行,六个空格等于字符串File: 的长度

      【讨论】:

        【解决方案3】:

        您总是可以在第一次迭代时从包含File: 的变量开始,每次都用正确数量的空格覆盖它。重复分配不会产生太多开销。

        prefix="File:"
        
        for i in "${files[@]}"
        do 
           printf "%-7s %-30s \n" "$prefix" "$i"
           prefix=
        done > Files.txt
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-21
          • 2022-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-18
          相关资源
          最近更新 更多