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;
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
add a comment |
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
1
count
must be 1 at the beginning or put((count++))
at the beginning of the inner loop. Then if you usedone < <(printf '%s' "$line")
instead ofdone <<<"$(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 withset -x
, you will see aprintf %s ''
at the end of every line except for on the line that becomes too long. This possibly means that your innerread
returns an empty string at the end of each line.
– Kusalananda♦
9 hours ago
add a comment |
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
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
bash text-processing
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 usedone < <(printf '%s' "$line")
instead ofdone <<<"$(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 withset -x
, you will see aprintf %s ''
at the end of every line except for on the line that becomes too long. This possibly means that your innerread
returns an empty string at the end of each line.
– Kusalananda♦
9 hours ago
add a comment |
1
count
must be 1 at the beginning or put((count++))
at the beginning of the inner loop. Then if you usedone < <(printf '%s' "$line")
instead ofdone <<<"$(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 withset -x
, you will see aprintf %s ''
at the end of every line except for on the line that becomes too long. This possibly means that your innerread
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
add a comment |
2 Answers
2
active
oldest
votes
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")"
.
add a comment |
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"
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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")"
.
add a comment |
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")"
.
add a comment |
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")"
.
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")"
.
answered 9 hours ago
pLumopLumo
6,64213 silver badges27 bronze badges
6,64213 silver badges27 bronze badges
add a comment |
add a comment |
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"
add a comment |
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"
add a comment |
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"
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"
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
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
count
must be 1 at the beginning or put((count++))
at the beginning of the inner loop. Then if you usedone < <(printf '%s' "$line")
instead ofdone <<<"$(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 aprintf %s ''
at the end of every line except for on the line that becomes too long. This possibly means that your innerread
returns an empty string at the end of each line.– Kusalananda♦
9 hours ago