私はこれが良いことや良い解決策ではないことを知っていますが、答えるだけです。これ問題、次の問題が発生しました。
目標は、入力ファイルを文字ごとに読み込み、指定された範囲内であればその文字を置き換えることです。
入力する:
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")"
。
答え2
私は次のように書くでしょう:
while IFS= read -r line; do
for ((i=0; i<${#line}; i++)); do
char=${line:i:1}
((count++))
((low <= count && count <= high)) && char=$new_char
printf '%s' "$char"
done
echo
done <"$input"