Why does my script create an extra character?Replace character based on range of coordinatesHow to read from two input files using while loopHow to name a file in the deepest level of a directory treeReading character by character with bash readBash is automatically reloading (injecting) updates into a running script upon saving it: Why? Any practical use?Create an ASCII art table from tabular dataIs there a way to execute commands while getting user input?Reading char-by-char silently does not workread 1 or several lines in bash - make it work when pasting (in addition to typing manually)How can I print out the delimiter character and allow user to edit line while reading standard input?How to replace last occurence of a character?

Did Lincoln tell Stowe "So you're the little woman that started this great war!"?

When did the Roman Empire fall according to contemporaries?

Is "take care'n of" correct?

Why are they 'nude photos'?

How did the hit man miss?

Graduate student with abysmal English writing skills, how to help

Was lunar module "pilot" Harrison Schmitt legally a "pilot" at the time?

How can I effectively communicate to recruiters that a phone call is not possible?

Why were Er and Onan punished if they were under 20?

Novel where a group of scientists in a spaceship encounter various aliens

A pyramid from a square

Maximum charterer insertion

How might the United Kingdom become a republic?

Shortest distance around a pyramid?

How to find the shape parameters of of a beta distribution given the position of two quantiles?

Why does my script create an extra character?

Why didn't Thanos kill all the Dwarves on Nidavellir?

Get ids only where one id is null and other isn't

Should disabled buttons give feedback when clicked?

How can one write good dialogue in a story without sounding wooden?

How can I deal with a player trying to insert real-world mythology into my homebrew setting?

ESTA: "Is your travel to the US occurring in transit to another country?" when going on a cruise

Professor falsely accusing me of cheating in a class he does not teach, two months after end of the class. What precautions should I take?

Why do players in the past play much longer tournaments than today's top players?



Why does my script create an extra character?


Replace character based on range of coordinatesHow to read from two input files using while loopHow to name a file in the deepest level of a directory treeReading character by character with bash readBash is automatically reloading (injecting) updates into a running script upon saving it: Why? Any practical use?Create an ASCII art table from tabular dataIs there a way to execute commands while getting user input?Reading char-by-char silently does not workread 1 or several lines in bash - make it work when pasting (in addition to typing manually)How can I print out the delimiter character and allow user to edit line while reading standard input?How to replace last occurence of a character?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








2















I know this isn't a good thing to do and/or a good solution but I was just messing around trying to answer this question and I came across the following problem.



The goal is to read the input file character by character and if the character is within the specified range, replace it.



Input:



NNNNN
NNNNN
NNNNN
NNNNN


Script:



#!/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"


Desired output (when run as: ./script.sh 10 13 P):



NNNNN
NNNNP
PPPNN
NNNNN


Actual output:



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


I'm not sure why it's seemingly creating a new character out of thin air on the 2nd line and not replacing the 13th character on the 3rd line. I've tried moving the ((count++)) statement to the beginning of the second while loop, I've tried starting at count=1, I've tried seemingly every combination of ((++count)) || count=$((count+1)) || ((count+1)). With varying results but all seem to add an extra character on the second line.



I've double checked that the input file has no trailing whitespace on any of the lines.










share|improve this question

















  • 1





    count must be 1 at the beginning or put ((count++)) at the beginning of the inner loop. Then if you use done < <(printf '%s' "$line") instead of done <<<"$(printf '%s' "$line")", it works as intended. I don't know why yet...

    – pLumo
    9 hours ago







  • 3





    I think <<<"string" creates a temp file in the background, and bash is not stripping the trailing newline like command substitution does.

    – glenn jackman
    9 hours ago











  • If you run with set -x, you will see a printf %s '' at the end of every line except for on the line that becomes too long. This possibly means that your inner read returns an empty string at the end of each line.

    – Kusalananda
    9 hours ago

















2















I know this isn't a good thing to do and/or a good solution but I was just messing around trying to answer this question and I came across the following problem.



The goal is to read the input file character by character and if the character is within the specified range, replace it.



Input:



NNNNN
NNNNN
NNNNN
NNNNN


Script:



#!/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"


Desired output (when run as: ./script.sh 10 13 P):



NNNNN
NNNNP
PPPNN
NNNNN


Actual output:



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


I'm not sure why it's seemingly creating a new character out of thin air on the 2nd line and not replacing the 13th character on the 3rd line. I've tried moving the ((count++)) statement to the beginning of the second while loop, I've tried starting at count=1, I've tried seemingly every combination of ((++count)) || count=$((count+1)) || ((count+1)). With varying results but all seem to add an extra character on the second line.



I've double checked that the input file has no trailing whitespace on any of the lines.










share|improve this question

















  • 1





    count must be 1 at the beginning or put ((count++)) at the beginning of the inner loop. Then if you use done < <(printf '%s' "$line") instead of done <<<"$(printf '%s' "$line")", it works as intended. I don't know why yet...

    – pLumo
    9 hours ago







  • 3





    I think <<<"string" creates a temp file in the background, and bash is not stripping the trailing newline like command substitution does.

    – glenn jackman
    9 hours ago











  • If you run with set -x, you will see a printf %s '' at the end of every line except for on the line that becomes too long. This possibly means that your inner read returns an empty string at the end of each line.

    – Kusalananda
    9 hours ago













2












2








2








I know this isn't a good thing to do and/or a good solution but I was just messing around trying to answer this question and I came across the following problem.



The goal is to read the input file character by character and if the character is within the specified range, replace it.



Input:



NNNNN
NNNNN
NNNNN
NNNNN


Script:



#!/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"


Desired output (when run as: ./script.sh 10 13 P):



NNNNN
NNNNP
PPPNN
NNNNN


Actual output:



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


I'm not sure why it's seemingly creating a new character out of thin air on the 2nd line and not replacing the 13th character on the 3rd line. I've tried moving the ((count++)) statement to the beginning of the second while loop, I've tried starting at count=1, I've tried seemingly every combination of ((++count)) || count=$((count+1)) || ((count+1)). With varying results but all seem to add an extra character on the second line.



I've double checked that the input file has no trailing whitespace on any of the lines.










share|improve this question














I know this isn't a good thing to do and/or a good solution but I was just messing around trying to answer this question and I came across the following problem.



The goal is to read the input file character by character and if the character is within the specified range, replace it.



Input:



NNNNN
NNNNN
NNNNN
NNNNN


Script:



#!/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"


Desired output (when run as: ./script.sh 10 13 P):



NNNNN
NNNNP
PPPNN
NNNNN


Actual output:



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


I'm not sure why it's seemingly creating a new character out of thin air on the 2nd line and not replacing the 13th character on the 3rd line. I've tried moving the ((count++)) statement to the beginning of the second while loop, I've tried starting at count=1, I've tried seemingly every combination of ((++count)) || count=$((count+1)) || ((count+1)). With varying results but all seem to add an extra character on the second line.



I've double checked that the input file has no trailing whitespace on any of the lines.







bash text-processing






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 9 hours ago









Jesse_bJesse_b

17.5k3 gold badges43 silver badges84 bronze badges




17.5k3 gold badges43 silver badges84 bronze badges







  • 1





    count must be 1 at the beginning or put ((count++)) at the beginning of the inner loop. Then if you use done < <(printf '%s' "$line") instead of done <<<"$(printf '%s' "$line")", it works as intended. I don't know why yet...

    – pLumo
    9 hours ago







  • 3





    I think <<<"string" creates a temp file in the background, and bash is not stripping the trailing newline like command substitution does.

    – glenn jackman
    9 hours ago











  • If you run with set -x, you will see a printf %s '' at the end of every line except for on the line that becomes too long. This possibly means that your inner read returns an empty string at the end of each line.

    – Kusalananda
    9 hours ago












  • 1





    count must be 1 at the beginning or put ((count++)) at the beginning of the inner loop. Then if you use done < <(printf '%s' "$line") instead of done <<<"$(printf '%s' "$line")", it works as intended. I don't know why yet...

    – pLumo
    9 hours ago







  • 3





    I think <<<"string" creates a temp file in the background, and bash is not stripping the trailing newline like command substitution does.

    – glenn jackman
    9 hours ago











  • If you run with set -x, you will see a printf %s '' at the end of every line except for on the line that becomes too long. This possibly means that your inner read returns an empty string at the end of each line.

    – Kusalananda
    9 hours ago







1




1





count must be 1 at the beginning or put ((count++)) at the beginning of the inner loop. Then if you use done < <(printf '%s' "$line") instead of done <<<"$(printf '%s' "$line")", it works as intended. I don't know why yet...

– pLumo
9 hours ago






count must be 1 at the beginning or put ((count++)) at the beginning of the inner loop. Then if you use done < <(printf '%s' "$line") instead of done <<<"$(printf '%s' "$line")", it works as intended. I don't know why yet...

– pLumo
9 hours ago





3




3





I think <<<"string" creates a temp file in the background, and bash is not stripping the trailing newline like command substitution does.

– glenn jackman
9 hours ago





I think <<<"string" creates a temp file in the background, and bash is not stripping the trailing newline like command substitution does.

– glenn jackman
9 hours ago













If you run with set -x, you will see a printf %s '' at the end of every line except for on the line that becomes too long. This possibly means that your inner read returns an empty string at the end of each line.

– Kusalananda
9 hours ago





If you run with set -x, you will see a printf %s '' at the end of every line except for on the line that becomes too long. This possibly means that your inner read returns an empty string at the end of each line.

– Kusalananda
9 hours ago










2 Answers
2






active

oldest

votes


















3














Here Strings seem to produce a newline at the end:



You can try and see the difference:



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


So, you should use < <(printf '%s' "$line") instead of <<<"$(printf '%s' "$line")".






share|improve this answer






























    2














    I would write:



    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"





    share|improve this answer



























      Your Answer








      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "106"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f529584%2fwhy-does-my-script-create-an-extra-character%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      3














      Here Strings seem to produce a newline at the end:



      You can try and see the difference:



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


      So, you should use < <(printf '%s' "$line") instead of <<<"$(printf '%s' "$line")".






      share|improve this answer



























        3














        Here Strings seem to produce a newline at the end:



        You can try and see the difference:



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


        So, you should use < <(printf '%s' "$line") instead of <<<"$(printf '%s' "$line")".






        share|improve this answer

























          3












          3








          3







          Here Strings seem to produce a newline at the end:



          You can try and see the difference:



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


          So, you should use < <(printf '%s' "$line") instead of <<<"$(printf '%s' "$line")".






          share|improve this answer













          Here Strings seem to produce a newline at the end:



          You can try and see the difference:



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


          So, you should use < <(printf '%s' "$line") instead of <<<"$(printf '%s' "$line")".







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 9 hours ago









          pLumopLumo

          6,64213 silver badges27 bronze badges




          6,64213 silver badges27 bronze badges























              2














              I would write:



              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"





              share|improve this answer





























                2














                I would write:



                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"





                share|improve this answer



























                  2












                  2








                  2







                  I would write:



                  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"





                  share|improve this answer















                  I would write:



                  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"






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 8 hours ago

























                  answered 9 hours ago









                  glenn jackmanglenn jackman

                  55k6 gold badges76 silver badges115 bronze badges




                  55k6 gold badges76 silver badges115 bronze badges



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Unix & Linux Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f529584%2fwhy-does-my-script-create-an-extra-character%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                      Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                      Ласкавець круглолистий Зміст Опис | Поширення | Галерея | Примітки | Посилання | Навігаційне меню58171138361-22960890446Bupleurum rotundifoliumEuro+Med PlantbasePlants of the World Online — Kew ScienceGermplasm Resources Information Network (GRIN)Ласкавецькн. VI : Літери Ком — Левиправивши або дописавши її