文本文件中任意一行的倒序(实现rev命令)
文本文件中任意一行的倒序(实现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[@]}"
打印时,它添加了额外的空格.. 为什么?
问题的原因是代码中使用了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。
问题的出现原因是需要实现一个类似于rev命令的文本文件中每一行的反转。解决方法是使用bash脚本编写一个循环来逐行读取文本文件,并将每一行反向输出。
在这个脚本中,使用了数组rotate_line来存储反转后的每个字符,并使用一个循环将每个字符逐个添加到数组中。然后使用另一个循环将数组中的字符逐个输出。这样就实现了文本文件中每一行的反转。
为了方便调试,使用了echo命令来输出单个字符,也可以使用cat命令来测试。此外,还讨论了在脚本中使用let命令和POSIX ((..))命令进行后增操作的差异,以及不推荐使用无用的cat命令的问题。
总结起来,该问题的出现原因是需要实现文本文件中每一行的反转,解决方法是使用bash脚本编写循环来逐行读取并反转每一行。
问题的出现原因是使用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
。