【发布时间】:2018-08-12 08:49:29
【问题描述】:
我试图编写一个代码来旋转文本文件中的每一行。例如,给定下一行:
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[@]}" 打印它时,它添加了一个新的空格.. 为什么 ?
【问题讨论】:
-
rev file呢? -
我正在尝试自己实现这个命令
-
while IFS= read -r line; do for ((i=${#line};i>0;i--)); do echo -n "${line:$i-1:1}"; done; echo; done < file? -
@Jor.Mal:在回答“use rev”之前我也很简短。您应该在帖子中(最好是在标题中)指出您喜欢自己实现 rev,因为每个阅读它的人都会立即朝这个方向思考。并且请不要使用 80 年代的那些过时的回溯。
-
@userunknown 在我与
>>运算符一起使用的 else 部分中,不会删除旧文件。和>操作员删除旧文件。 (如果之前运行的存在同名文件我想删除它)