私のスクリプトが追加の文字を生成するのはなぜですか?

私のスクリプトが追加の文字を生成するのはなぜですか?

私はこれが良いことや良い解決策ではないことを知っていますが、答えるだけです。これ問題、次の問題が発生しました。

目標は、入力ファイルを文字ごとに読み込み、指定された範囲内であればその文字を置き換えることです。

入力する:

NNNNN
NNNNN
NNNNN
NNNNN

スクリプト:

#!/bin/bash
#set -x

input=~/tmp/in
declare -i count=0
low=$1
high=$2
new_char=$3

while IFS=$'\n' read -r line; do
    while IFS= read -rn1 char; do
        if ((count>=low)) && ((count<=high)); then
            printf '%s' "$new_char"
        else
            printf '%s' "$char"
        fi
        ((count++))
    done <<<"$(printf '%s' "$line")"
    echo
done <"$input"

希望の出力(実行時:)./script.sh 10 13 P

NNNNN
NNNNP
PPPNN
NNNNN

実際の出力:

$ ./script.sh 10 13 P
NNNNN
NNNNPP
PPNNN
NNNNN

なぜ3番目の行の13番目の文字を置き換えるのではなく、2番目の行の虚空から新しい文字を生成するように見えるのかわかりません。私はステートメントを2番目のwhileループの先頭に移動しようとしましたが、((count++))最初から始めようとしました。||||と思われるすべての組み合わせをcount=1試しました。結果はさまざまですが、すべて2行目に追加の文字を追加するようです。((++count))count=$((count+1))((count+1))

入力ファイルのすべての行に末尾のスペースがないことを再確認しました。

ベストアンサー1

この文字列は最後に改行文字を生成するようです。

違いを確認してください。

cat <<<"test"
cat <(printf '%s' "test")

< <(printf '%s' "$line")したがって、代わりに使用する必要があります <<<"$(printf '%s' "$line")"

おすすめ記事