文本文件中任意一行的倒序(实现rev命令)

9 浏览
0 Comments

文本文件中任意一行的倒序(实现rev命令)

我尝试编写一段代码,用于将文本文件中的每一行进行旋转。例如,给定以下行:

a b c

输出将为:

c b a

这个脚本只需要一个参数 - 文本文件的名称。此外,我希望在处理额外的空格时要有意义。也就是说,给定以下行:

a b c

输出将为:

c b a

注:输出将保存在同名的新文件中,只是后缀名为.rotate

我的代码:

#!/bin/bash
name_of_file=$1
first_step=1
while read line; do
    length_of_line=`echo -n "${line}" | wc -c`
    rotate_line=()
    index_of_line=0
    index_of_rotate=$(( length_of_line - 1 ))
        while (( ${index_of_line} < ${length_of_line} )); do
        rotate_line[${index_of_rotate}]="${line[@]:${index_of_line}:1}"
        let index_of_line++
        let index_of_rotate--
        done
        if (( ${first_step} == 1 )); then
            echo "${rotate_line[@]}" > $1.rotate1
            first_step=0
        else
            echo "${rotate_line[@]}" >> $1.rotate1
        fi
done < ${name_of_file}

问题:

我不知道为什么,但是,给定以下行:

a b c

输出为:

c b a

这个额外的空格是从哪里来的?

注:当我逐个打印旋转数组时,它是正确的(没有额外的空格) - 但是,当我用"${rotate_line[@]}"打印时,它添加了额外的空格.. 为什么

0
0 Comments

问题的原因是代码中使用了echo命令来输出字符串,而echo命令会在输出时添加空格。解决方法是使用其他命令或技巧来实现字符串的反转,避免空格的添加。以下是一种可能的解决方法:

x='abc'
reversed=""
for ((i=${#x}; i>0; i--)); do
    reversed="${reversed}${x:$i:1}"
done
echo $reversed

在这个解决方案中,我们使用了一个新的变量reversed来存储反转后的字符串。在每次循环中,我们将原始字符串x的每个字符从最后一个字符开始逐个拼接到reversed变量中。最后,我们使用echo命令输出反转后的字符串$reversed。这样就可以避免空格的添加,得到预期的输出结果cba。

0
0 Comments

问题的出现原因是需要实现一个类似于rev命令的文本文件中每一行的反转。解决方法是使用bash脚本编写一个循环来逐行读取文本文件,并将每一行反向输出。

在这个脚本中,使用了数组rotate_line来存储反转后的每个字符,并使用一个循环将每个字符逐个添加到数组中。然后使用另一个循环将数组中的字符逐个输出。这样就实现了文本文件中每一行的反转。

为了方便调试,使用了echo命令来输出单个字符,也可以使用cat命令来测试。此外,还讨论了在脚本中使用let命令和POSIX ((..))命令进行后增操作的差异,以及不推荐使用无用的cat命令的问题。

总结起来,该问题的出现原因是需要实现文本文件中每一行的反转,解决方法是使用bash脚本编写循环来逐行读取并反转每一行。

0
0 Comments

问题的出现原因是使用echo "${rotate_line[@]}" > file将数组输出到文件时,echo命令会使用空格分隔数组元素,默认输出元素之间会有额外的空格。解决方法是使用以下两种方法之一:

1. 使用子shell和IFS变量来输出数组元素:(IFS=; echo "${rotate_line[*]}") > file

2. 使用printf命令来输出数组元素,并添加换行符:printf '%s' "${rotate_line[@]}" $'\n' > file

此外,代码中还存在其他问题,例如while read line可能会删除行首和行尾的空格,并破坏反斜杠。可以使用while IFS= read -r line来代替。

在对于问题的进一步讨论中,提到了另一个问题:当一行以字母开头,后面只有空格时,变量line不包含空格,只包含第一个字母。解决方法是在read命令中使用IFS=来禁用默认的空格删除功能:IFS= read -r line

0