在bash中逐个字符地读取用户给定的文件

时间:2014-02-23 13:39:45

标签: bash shell

我有一个未格式化的文件,我想在每100个字符后放置一个换行符,并删除其中的任何其他新行,以便文件看起来具有一致的宽度和可读性

此代码段有助于阅读所有行

 while read LINE
        do
                len=${#LINE}
                echo "Line length is : $len"
        done < $file

但我如何为角色做同样的事情

想法是这样的:(只是一个例子,它可能有语法错误,尚未实现

 while read ch  #read character
  do
         chcount++ # increment character count

    if [ "$chcount" -eq "100" && "$ch"!="\n" ] #if 100th character and is not a new line
    then
        echo -e "\n" #echo new line
    elif [ "$ch"=="\n" ]  #if character is not 100th but new line
        then
        ch=" " $replace it with space
     fi
  done < $file

我正在学习bash,所以请放轻松!!

4 个答案:

答案 0 :(得分:6)

  

我想在每100个字符后放置一个换行符并删除任何一行   其他新行,以便文件可以看起来具有一致的宽度和   可读

除非您有充分的理由编写脚本,否则请继续编写脚本。

从输入中删除换行符并将其折叠。话说:

tr -d '\n' < inputfile | fold -w 100

应该达到预期的效果。

答案 1 :(得分:4)

bash在标准-n命令中添加read标志,以指定要读取的字符数,而不是整行:

while read -n1 c; do
    echo "$c"
done < $file

答案 2 :(得分:3)

您可以通过以下任何方式调用以下功能:

line_length=100
wrap $line_length <<< "$string"
wrap $line_length < file_name
wrap $line_length < <(command)
command | wrap $line_length

该函数逐行读取输入(比字符更有效),这基本上消除了现有的换行符(由空格替换)。前一行的其余部分以当前行的前缀为前缀,结果以所需的行长度分割。拆分后的余数保留用于下一次迭代。如果输出缓冲区已满,则输出并清除,否则将保留下一次迭代,以便添加更多缓冲区。消耗完输入后,其余部分可能会有其他文本。该函数以递归方式调用,直到它也被消耗并输出。

wrap () { 
    local remainder rest part out_buffer line len=$1
    while IFS= read -r line
    do
        line="$remainder$line "
        (( part = $len - ${#out_buffer} ))
        out_buffer+=${line::$part}
        remainder=${line:$part}
        if (( ${#out_buffer} >= $len ))
        then
            printf '%s\n' "$out_buffer"
            out_buffer=
        fi
    done
    rest=$remainder
    while [[ $rest ]]
    do
        wrap $len <<< "$rest"
    done
    if [[ $out_buffer ]]
    then
        printf '%s\n' "$out_buffer"
        out_buffer=
    fi
}

答案 3 :(得分:0)

#!/bin/bash
w=~/testFile.txt
chcount=0
while read -r word ; do
        len=${#word}
        for (( i = 0 ; i <= $len - 1 ; ++i )) ; do
                let chcount+=1
                if [ $chcount -eq 100 ] ; then
                        printf "\n${word:$i:1}"
                        let chcount=0
                else
                        printf "${word:$i:1}"
                fi
        done
done < $w

你在找这样的东西吗?