Using parameter substitution on a Bash arrayIndexing and modifying Bash parameter array $@Auto-expansion problem with array elements containing an '*' (asterisk)How to do a control loopaccess elements in string array - stray @ symbolDouble quotes in bashUsage of ! in parameter expansionProperly escaping output from command substitution to be used as arguments for another commandHow to add values to an array which contains a variable in the array name in bash?Why is bash history substitution still enabled by default?Unexpected outcome of a=“$@”

Which country benefited the most from UN Security Council vetoes?

Revoked SSL certificate

Arrow those variables!

Why doesn't a class having private constructor prevent inheriting from this class? How to control which classes can inherit from a certain base?

Does Otiluke's Resilient Sphere beat Magic Circle?

Is it legal for company to use my work email to pretend I still work there?

DC-DC converter from low voltage at high current, to high voltage at low current

Languages that we cannot (dis)prove to be Context-Free

Linear Path Optimization with Two Dependent Variables

Doing something right before you need it - expression for this?

Rock identification in KY

What's that red-plus icon near a text?

Watching something be written to a file live with tail

Horror movie about the virus at the prom; beginning and end are stylized as a cartoon

How does one intimidate enemies without having the capacity for violence?

Operational amplifier as comparator at high frequency

Why is Minecraft giving an OpenGL error?

What is the word for reserving something for yourself before others do?

How much RAM could one put in a typical 80386 setup?

Alternative to sending password over mail?

definition of observer and time measured by different observers in general relativity

Decision tree nodes overlapping with Tikz

meaning of に in 本当に?

How bulky would the original autograph of the Torah been?



Using parameter substitution on a Bash array


Indexing and modifying Bash parameter array $@Auto-expansion problem with array elements containing an '*' (asterisk)How to do a control loopaccess elements in string array - stray @ symbolDouble quotes in bashUsage of ! in parameter expansionProperly escaping output from command substitution to be used as arguments for another commandHow to add values to an array which contains a variable in the array name in bash?Why is bash history substitution still enabled by default?Unexpected outcome of a=“$@”






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








5















I have file.txt that I need to read into a Bash array. Then I need to remove spaces, double quotes and all but the first comma in every entry. Here's how far I've gotten:



$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"

$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "$ARRAY[@]// /" )
ARRAY=( "$ARRAY[@]//"/" )
for ELEMENT in "$ARRAY[@]";do
echo "|ELEMENT|$ELEMENT|"
done

$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|


Which works great except for the comma situation. I'm aware that there are multiple ways to skin this cat, but due to the larger script this is a part of, I'd really like to use parameter substitution to get to here:



|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|


Is this possible via parameter substitution?










share|improve this question

















  • 3





    Is there any reason you need to keep the text in an array, and why you can't let e.g. awk or sed do the processing of the data?

    – Kusalananda
    Mar 26 at 15:49











  • @Jeff -- Looping over the array will be a nightmare to implement in the larger script I'm working on.

    – Jon Red
    Mar 26 at 16:04






  • 3





    @JonRed I don't know what you are doing, so it's entirely possible that you may not have a choice in the matter, but generally, when you find yourself doing such complex string acrobatics in the shell, that's a very good indication that you should be using an actual programming language. The shell is not designed as a programming language, and while it can be used as one, it really isn't a good idea for more complex things. I strongly urge you to consider switching to perl or python or any other scripting language.

    – terdon
    Mar 26 at 16:12











  • @terdon It's funny, I just got done saying almost the exact same thing to my colleague before I read this post. I basically said this is the final version of this script and that any further requirements will necessitate re-writing in Perl. So yeah, I definitely agree

    – Jon Red
    Mar 26 at 17:37

















5















I have file.txt that I need to read into a Bash array. Then I need to remove spaces, double quotes and all but the first comma in every entry. Here's how far I've gotten:



$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"

$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "$ARRAY[@]// /" )
ARRAY=( "$ARRAY[@]//"/" )
for ELEMENT in "$ARRAY[@]";do
echo "|ELEMENT|$ELEMENT|"
done

$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|


Which works great except for the comma situation. I'm aware that there are multiple ways to skin this cat, but due to the larger script this is a part of, I'd really like to use parameter substitution to get to here:



|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|


Is this possible via parameter substitution?










share|improve this question

















  • 3





    Is there any reason you need to keep the text in an array, and why you can't let e.g. awk or sed do the processing of the data?

    – Kusalananda
    Mar 26 at 15:49











  • @Jeff -- Looping over the array will be a nightmare to implement in the larger script I'm working on.

    – Jon Red
    Mar 26 at 16:04






  • 3





    @JonRed I don't know what you are doing, so it's entirely possible that you may not have a choice in the matter, but generally, when you find yourself doing such complex string acrobatics in the shell, that's a very good indication that you should be using an actual programming language. The shell is not designed as a programming language, and while it can be used as one, it really isn't a good idea for more complex things. I strongly urge you to consider switching to perl or python or any other scripting language.

    – terdon
    Mar 26 at 16:12











  • @terdon It's funny, I just got done saying almost the exact same thing to my colleague before I read this post. I basically said this is the final version of this script and that any further requirements will necessitate re-writing in Perl. So yeah, I definitely agree

    – Jon Red
    Mar 26 at 17:37













5












5








5


1






I have file.txt that I need to read into a Bash array. Then I need to remove spaces, double quotes and all but the first comma in every entry. Here's how far I've gotten:



$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"

$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "$ARRAY[@]// /" )
ARRAY=( "$ARRAY[@]//"/" )
for ELEMENT in "$ARRAY[@]";do
echo "|ELEMENT|$ELEMENT|"
done

$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|


Which works great except for the comma situation. I'm aware that there are multiple ways to skin this cat, but due to the larger script this is a part of, I'd really like to use parameter substitution to get to here:



|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|


Is this possible via parameter substitution?










share|improve this question














I have file.txt that I need to read into a Bash array. Then I need to remove spaces, double quotes and all but the first comma in every entry. Here's how far I've gotten:



$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"

$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "$ARRAY[@]// /" )
ARRAY=( "$ARRAY[@]//"/" )
for ELEMENT in "$ARRAY[@]";do
echo "|ELEMENT|$ELEMENT|"
done

$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|


Which works great except for the comma situation. I'm aware that there are multiple ways to skin this cat, but due to the larger script this is a part of, I'd really like to use parameter substitution to get to here:



|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|


Is this possible via parameter substitution?







bash shell-script array variable-substitution parameter






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Mar 26 at 15:44









Jon RedJon Red

698




698







  • 3





    Is there any reason you need to keep the text in an array, and why you can't let e.g. awk or sed do the processing of the data?

    – Kusalananda
    Mar 26 at 15:49











  • @Jeff -- Looping over the array will be a nightmare to implement in the larger script I'm working on.

    – Jon Red
    Mar 26 at 16:04






  • 3





    @JonRed I don't know what you are doing, so it's entirely possible that you may not have a choice in the matter, but generally, when you find yourself doing such complex string acrobatics in the shell, that's a very good indication that you should be using an actual programming language. The shell is not designed as a programming language, and while it can be used as one, it really isn't a good idea for more complex things. I strongly urge you to consider switching to perl or python or any other scripting language.

    – terdon
    Mar 26 at 16:12











  • @terdon It's funny, I just got done saying almost the exact same thing to my colleague before I read this post. I basically said this is the final version of this script and that any further requirements will necessitate re-writing in Perl. So yeah, I definitely agree

    – Jon Red
    Mar 26 at 17:37












  • 3





    Is there any reason you need to keep the text in an array, and why you can't let e.g. awk or sed do the processing of the data?

    – Kusalananda
    Mar 26 at 15:49











  • @Jeff -- Looping over the array will be a nightmare to implement in the larger script I'm working on.

    – Jon Red
    Mar 26 at 16:04






  • 3





    @JonRed I don't know what you are doing, so it's entirely possible that you may not have a choice in the matter, but generally, when you find yourself doing such complex string acrobatics in the shell, that's a very good indication that you should be using an actual programming language. The shell is not designed as a programming language, and while it can be used as one, it really isn't a good idea for more complex things. I strongly urge you to consider switching to perl or python or any other scripting language.

    – terdon
    Mar 26 at 16:12











  • @terdon It's funny, I just got done saying almost the exact same thing to my colleague before I read this post. I basically said this is the final version of this script and that any further requirements will necessitate re-writing in Perl. So yeah, I definitely agree

    – Jon Red
    Mar 26 at 17:37







3




3





Is there any reason you need to keep the text in an array, and why you can't let e.g. awk or sed do the processing of the data?

– Kusalananda
Mar 26 at 15:49





Is there any reason you need to keep the text in an array, and why you can't let e.g. awk or sed do the processing of the data?

– Kusalananda
Mar 26 at 15:49













@Jeff -- Looping over the array will be a nightmare to implement in the larger script I'm working on.

– Jon Red
Mar 26 at 16:04





@Jeff -- Looping over the array will be a nightmare to implement in the larger script I'm working on.

– Jon Red
Mar 26 at 16:04




3




3





@JonRed I don't know what you are doing, so it's entirely possible that you may not have a choice in the matter, but generally, when you find yourself doing such complex string acrobatics in the shell, that's a very good indication that you should be using an actual programming language. The shell is not designed as a programming language, and while it can be used as one, it really isn't a good idea for more complex things. I strongly urge you to consider switching to perl or python or any other scripting language.

– terdon
Mar 26 at 16:12





@JonRed I don't know what you are doing, so it's entirely possible that you may not have a choice in the matter, but generally, when you find yourself doing such complex string acrobatics in the shell, that's a very good indication that you should be using an actual programming language. The shell is not designed as a programming language, and while it can be used as one, it really isn't a good idea for more complex things. I strongly urge you to consider switching to perl or python or any other scripting language.

– terdon
Mar 26 at 16:12













@terdon It's funny, I just got done saying almost the exact same thing to my colleague before I read this post. I basically said this is the final version of this script and that any further requirements will necessitate re-writing in Perl. So yeah, I definitely agree

– Jon Red
Mar 26 at 17:37





@terdon It's funny, I just got done saying almost the exact same thing to my colleague before I read this post. I basically said this is the final version of this script and that any further requirements will necessitate re-writing in Perl. So yeah, I definitely agree

– Jon Red
Mar 26 at 17:37










5 Answers
5






active

oldest

votes


















8














I would remove what you need to remove using sed before loading into the array (also note the lower case variable names, in general it is best to avoid capitalized variables in shell scripts):



#!/bin/bash
readarray -t array< <(sed 's/"//g; s/ *//g; s/,/"/; s/,//g; s/"/,/' "$1")
for element in "$array[@]";do
echo "|ELEMENT|$element|"
done


This produces the following output on your example file:



$ foo.sh file 
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|



If you really must use parameter substitution, try something like this:



#!/bin/bash
readarray -t array< "$1"
array=( "$array[@]// /" )
array=( "$array[@]//"/" )
array=( "$array[@]/,/"" )
array=( "$array[@]//,/" )
array=( "$array[@]/"/," )

for element in "$array[@]"; do
echo "|ELEMENT|$element|"
done





share|improve this answer




















  • 1





    @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

    – terdon
    Mar 26 at 16:06






  • 1





    Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

    – Kusalananda
    Mar 26 at 16:08






  • 1





    @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

    – terdon
    Mar 26 at 16:10











  • Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

    – Jon Red
    Mar 26 at 16:20


















9














As far as I can see, there's no need to read it into a bash array to create that output:



$ sed 's/[ "]//g; s/,/ /; s/,//g; s/ /,/; s/.*/|ELEMENT|&|/' <file
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|


The sed expression deletes spaces and double quotes, replaces the first comma with a space (there are no other spaces in the string at this point), deletes all other commas, restores the first comma, and the prepends and appends the extra data.



Alternatively, with GNU sed:



sed 's/[ "]//g; s/,//2g; s/.*/|ELEMENT|&|/' <file


(standard sed does not support the combination of 2 and g as flags to the s command).






share|improve this answer




















  • 1





    with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

    – glenn jackman
    Mar 26 at 16:02






  • 2





    And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

    – glenn jackman
    Mar 26 at 16:04






  • 1





    @glennjackman Possibly, but it looks rather neat.

    – Kusalananda
    Mar 26 at 16:05











  • Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

    – Jon Red
    Mar 26 at 16:06











  • If I wasn't tied to using an array, however, this would be best solution.

    – Jon Red
    Mar 26 at 16:24


















8














ELEMENT='50,n,e,e,d,2'
IFS=, read -r first rest <<<"$ELEMENT"
printf "%s,%sn" "$first" "$rest//,/"




50,need2


Get out of the habit of using ALLCAPS variable names. You'll eventually collide with a crucial "system" variable like PATH and break your code.






share|improve this answer























  • Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

    – Jon Red
    Mar 26 at 16:14






  • 1





    I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

    – glenn jackman
    Mar 26 at 16:17






  • 1





    There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

    – Jeff Schaller
    Mar 26 at 16:19


















7














[This is essentially a more fully developed version of glenn jackmann's answer]



Building an associative array from the stripped key and value, using the first comma as separator:



declare -A arr
while IFS=, read -r k v; do arr["$k//[ "]"]="$v//[ ,"]"; done < file.txt
for k in "$!arr[@]"; do
printf '|ELEMENT|%s,%s|n' "$k" "$arr[$k]"
done
|ELEMENT|20,is|
|ELEMENT|10,this|
|ELEMENT|50,need2|
|ELEMENT|40,I|
|ELEMENT|60,see|
|ELEMENT|30,all|





share|improve this answer






























    6














    You could loop over the array and use an intermediate variable:



    for((i=0; i < "$#ARRAY[@]"; i++))
    do
    rest="$ARRAY[i]#*,"
    ARRAY[i]="$ARRAY[i]%%,*","$rest//,/"
    done


    This assigns to rest the portion after the first comma; we then concatenate three pieces back into the original variable:



    • the portion before the first comma

    • a comma

    • the replacement in rest of every comma with nothing





    share|improve this answer























    • This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

      – Jon Red
      Mar 26 at 16:26






    • 1





      Fair enough; I just tried to answer within the limitations (parameter expansion only).

      – Jeff Schaller
      Mar 26 at 16:27











    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%2f508777%2fusing-parameter-substitution-on-a-bash-array%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    5 Answers
    5






    active

    oldest

    votes








    5 Answers
    5






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    8














    I would remove what you need to remove using sed before loading into the array (also note the lower case variable names, in general it is best to avoid capitalized variables in shell scripts):



    #!/bin/bash
    readarray -t array< <(sed 's/"//g; s/ *//g; s/,/"/; s/,//g; s/"/,/' "$1")
    for element in "$array[@]";do
    echo "|ELEMENT|$element|"
    done


    This produces the following output on your example file:



    $ foo.sh file 
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|



    If you really must use parameter substitution, try something like this:



    #!/bin/bash
    readarray -t array< "$1"
    array=( "$array[@]// /" )
    array=( "$array[@]//"/" )
    array=( "$array[@]/,/"" )
    array=( "$array[@]//,/" )
    array=( "$array[@]/"/," )

    for element in "$array[@]"; do
    echo "|ELEMENT|$element|"
    done





    share|improve this answer




















    • 1





      @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

      – terdon
      Mar 26 at 16:06






    • 1





      Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

      – Kusalananda
      Mar 26 at 16:08






    • 1





      @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

      – terdon
      Mar 26 at 16:10











    • Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

      – Jon Red
      Mar 26 at 16:20















    8














    I would remove what you need to remove using sed before loading into the array (also note the lower case variable names, in general it is best to avoid capitalized variables in shell scripts):



    #!/bin/bash
    readarray -t array< <(sed 's/"//g; s/ *//g; s/,/"/; s/,//g; s/"/,/' "$1")
    for element in "$array[@]";do
    echo "|ELEMENT|$element|"
    done


    This produces the following output on your example file:



    $ foo.sh file 
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|



    If you really must use parameter substitution, try something like this:



    #!/bin/bash
    readarray -t array< "$1"
    array=( "$array[@]// /" )
    array=( "$array[@]//"/" )
    array=( "$array[@]/,/"" )
    array=( "$array[@]//,/" )
    array=( "$array[@]/"/," )

    for element in "$array[@]"; do
    echo "|ELEMENT|$element|"
    done





    share|improve this answer




















    • 1





      @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

      – terdon
      Mar 26 at 16:06






    • 1





      Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

      – Kusalananda
      Mar 26 at 16:08






    • 1





      @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

      – terdon
      Mar 26 at 16:10











    • Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

      – Jon Red
      Mar 26 at 16:20













    8












    8








    8







    I would remove what you need to remove using sed before loading into the array (also note the lower case variable names, in general it is best to avoid capitalized variables in shell scripts):



    #!/bin/bash
    readarray -t array< <(sed 's/"//g; s/ *//g; s/,/"/; s/,//g; s/"/,/' "$1")
    for element in "$array[@]";do
    echo "|ELEMENT|$element|"
    done


    This produces the following output on your example file:



    $ foo.sh file 
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|



    If you really must use parameter substitution, try something like this:



    #!/bin/bash
    readarray -t array< "$1"
    array=( "$array[@]// /" )
    array=( "$array[@]//"/" )
    array=( "$array[@]/,/"" )
    array=( "$array[@]//,/" )
    array=( "$array[@]/"/," )

    for element in "$array[@]"; do
    echo "|ELEMENT|$element|"
    done





    share|improve this answer















    I would remove what you need to remove using sed before loading into the array (also note the lower case variable names, in general it is best to avoid capitalized variables in shell scripts):



    #!/bin/bash
    readarray -t array< <(sed 's/"//g; s/ *//g; s/,/"/; s/,//g; s/"/,/' "$1")
    for element in "$array[@]";do
    echo "|ELEMENT|$element|"
    done


    This produces the following output on your example file:



    $ foo.sh file 
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|



    If you really must use parameter substitution, try something like this:



    #!/bin/bash
    readarray -t array< "$1"
    array=( "$array[@]// /" )
    array=( "$array[@]//"/" )
    array=( "$array[@]/,/"" )
    array=( "$array[@]//,/" )
    array=( "$array[@]/"/," )

    for element in "$array[@]"; do
    echo "|ELEMENT|$element|"
    done






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Mar 26 at 16:10

























    answered Mar 26 at 15:52









    terdonterdon

    133k33267447




    133k33267447







    • 1





      @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

      – terdon
      Mar 26 at 16:06






    • 1





      Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

      – Kusalananda
      Mar 26 at 16:08






    • 1





      @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

      – terdon
      Mar 26 at 16:10











    • Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

      – Jon Red
      Mar 26 at 16:20












    • 1





      @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

      – terdon
      Mar 26 at 16:06






    • 1





      Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

      – Kusalananda
      Mar 26 at 16:08






    • 1





      @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

      – terdon
      Mar 26 at 16:10











    • Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

      – Jon Red
      Mar 26 at 16:20







    1




    1





    @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

    – terdon
    Mar 26 at 16:06





    @JonRed I added a version with parameter substitution but it's complex, cumbersome and ugly. Doing this sort of thing in the shell is very rarely a good idea.

    – terdon
    Mar 26 at 16:06




    1




    1





    Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

    – Kusalananda
    Mar 26 at 16:08





    Note that if you've removed both spaces and double quotes, these characters becoma available to use instead of your RANDOMTEXTTHATWILLNEVERBEINTHEFILE.

    – Kusalananda
    Mar 26 at 16:08




    1




    1





    @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

    – terdon
    Mar 26 at 16:10





    @Kusalananda yeah, I just read your answer. Should have thought of that! Thanks :)

    – terdon
    Mar 26 at 16:10













    Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

    – Jon Red
    Mar 26 at 16:20





    Directly answers the question, illustrates why my preferred solution isn't ideal, and provides the most viable alternative. You win, best answer.

    – Jon Red
    Mar 26 at 16:20













    9














    As far as I can see, there's no need to read it into a bash array to create that output:



    $ sed 's/[ "]//g; s/,/ /; s/,//g; s/ /,/; s/.*/|ELEMENT|&|/' <file
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|


    The sed expression deletes spaces and double quotes, replaces the first comma with a space (there are no other spaces in the string at this point), deletes all other commas, restores the first comma, and the prepends and appends the extra data.



    Alternatively, with GNU sed:



    sed 's/[ "]//g; s/,//2g; s/.*/|ELEMENT|&|/' <file


    (standard sed does not support the combination of 2 and g as flags to the s command).






    share|improve this answer




















    • 1





      with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

      – glenn jackman
      Mar 26 at 16:02






    • 2





      And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

      – glenn jackman
      Mar 26 at 16:04






    • 1





      @glennjackman Possibly, but it looks rather neat.

      – Kusalananda
      Mar 26 at 16:05











    • Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

      – Jon Red
      Mar 26 at 16:06











    • If I wasn't tied to using an array, however, this would be best solution.

      – Jon Red
      Mar 26 at 16:24















    9














    As far as I can see, there's no need to read it into a bash array to create that output:



    $ sed 's/[ "]//g; s/,/ /; s/,//g; s/ /,/; s/.*/|ELEMENT|&|/' <file
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|


    The sed expression deletes spaces and double quotes, replaces the first comma with a space (there are no other spaces in the string at this point), deletes all other commas, restores the first comma, and the prepends and appends the extra data.



    Alternatively, with GNU sed:



    sed 's/[ "]//g; s/,//2g; s/.*/|ELEMENT|&|/' <file


    (standard sed does not support the combination of 2 and g as flags to the s command).






    share|improve this answer




















    • 1





      with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

      – glenn jackman
      Mar 26 at 16:02






    • 2





      And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

      – glenn jackman
      Mar 26 at 16:04






    • 1





      @glennjackman Possibly, but it looks rather neat.

      – Kusalananda
      Mar 26 at 16:05











    • Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

      – Jon Red
      Mar 26 at 16:06











    • If I wasn't tied to using an array, however, this would be best solution.

      – Jon Red
      Mar 26 at 16:24













    9












    9








    9







    As far as I can see, there's no need to read it into a bash array to create that output:



    $ sed 's/[ "]//g; s/,/ /; s/,//g; s/ /,/; s/.*/|ELEMENT|&|/' <file
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|


    The sed expression deletes spaces and double quotes, replaces the first comma with a space (there are no other spaces in the string at this point), deletes all other commas, restores the first comma, and the prepends and appends the extra data.



    Alternatively, with GNU sed:



    sed 's/[ "]//g; s/,//2g; s/.*/|ELEMENT|&|/' <file


    (standard sed does not support the combination of 2 and g as flags to the s command).






    share|improve this answer















    As far as I can see, there's no need to read it into a bash array to create that output:



    $ sed 's/[ "]//g; s/,/ /; s/,//g; s/ /,/; s/.*/|ELEMENT|&|/' <file
    |ELEMENT|10,this|
    |ELEMENT|20,is|
    |ELEMENT|30,all|
    |ELEMENT|40,I|
    |ELEMENT|50,need2|
    |ELEMENT|60,see|


    The sed expression deletes spaces and double quotes, replaces the first comma with a space (there are no other spaces in the string at this point), deletes all other commas, restores the first comma, and the prepends and appends the extra data.



    Alternatively, with GNU sed:



    sed 's/[ "]//g; s/,//2g; s/.*/|ELEMENT|&|/' <file


    (standard sed does not support the combination of 2 and g as flags to the s command).







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Mar 26 at 17:35

























    answered Mar 26 at 16:01









    KusalanandaKusalananda

    140k17261433




    140k17261433







    • 1





      with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

      – glenn jackman
      Mar 26 at 16:02






    • 2





      And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

      – glenn jackman
      Mar 26 at 16:04






    • 1





      @glennjackman Possibly, but it looks rather neat.

      – Kusalananda
      Mar 26 at 16:05











    • Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

      – Jon Red
      Mar 26 at 16:06











    • If I wasn't tied to using an array, however, this would be best solution.

      – Jon Red
      Mar 26 at 16:24












    • 1





      with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

      – glenn jackman
      Mar 26 at 16:02






    • 2





      And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

      – glenn jackman
      Mar 26 at 16:04






    • 1





      @glennjackman Possibly, but it looks rather neat.

      – Kusalananda
      Mar 26 at 16:05











    • Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

      – Jon Red
      Mar 26 at 16:06











    • If I wasn't tied to using an array, however, this would be best solution.

      – Jon Red
      Mar 26 at 16:24







    1




    1





    with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

    – glenn jackman
    Mar 26 at 16:02





    with GNU sed, you can use 's/,//2g to remove commas, starting with the 2nd

    – glenn jackman
    Mar 26 at 16:02




    2




    2





    And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

    – glenn jackman
    Mar 26 at 16:04





    And, the last 2 s/// commands can be s/.*/|ELEMENT|&|/ but that may be more effort for sed.

    – glenn jackman
    Mar 26 at 16:04




    1




    1





    @glennjackman Possibly, but it looks rather neat.

    – Kusalananda
    Mar 26 at 16:05





    @glennjackman Possibly, but it looks rather neat.

    – Kusalananda
    Mar 26 at 16:05













    Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

    – Jon Red
    Mar 26 at 16:06





    Yeah, this is part of a larger script. The array is necessary, not just for the output. Hence my interest in parameter substitution. I could loop over the array with this but that will be a nightmare to implement. Terndon provided a loop-free solution using sed that I'll likely fall back on if parameter substitution is a no-go.

    – Jon Red
    Mar 26 at 16:06













    If I wasn't tied to using an array, however, this would be best solution.

    – Jon Red
    Mar 26 at 16:24





    If I wasn't tied to using an array, however, this would be best solution.

    – Jon Red
    Mar 26 at 16:24











    8














    ELEMENT='50,n,e,e,d,2'
    IFS=, read -r first rest <<<"$ELEMENT"
    printf "%s,%sn" "$first" "$rest//,/"




    50,need2


    Get out of the habit of using ALLCAPS variable names. You'll eventually collide with a crucial "system" variable like PATH and break your code.






    share|improve this answer























    • Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

      – Jon Red
      Mar 26 at 16:14






    • 1





      I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

      – glenn jackman
      Mar 26 at 16:17






    • 1





      There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

      – Jeff Schaller
      Mar 26 at 16:19















    8














    ELEMENT='50,n,e,e,d,2'
    IFS=, read -r first rest <<<"$ELEMENT"
    printf "%s,%sn" "$first" "$rest//,/"




    50,need2


    Get out of the habit of using ALLCAPS variable names. You'll eventually collide with a crucial "system" variable like PATH and break your code.






    share|improve this answer























    • Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

      – Jon Red
      Mar 26 at 16:14






    • 1





      I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

      – glenn jackman
      Mar 26 at 16:17






    • 1





      There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

      – Jeff Schaller
      Mar 26 at 16:19













    8












    8








    8







    ELEMENT='50,n,e,e,d,2'
    IFS=, read -r first rest <<<"$ELEMENT"
    printf "%s,%sn" "$first" "$rest//,/"




    50,need2


    Get out of the habit of using ALLCAPS variable names. You'll eventually collide with a crucial "system" variable like PATH and break your code.






    share|improve this answer













    ELEMENT='50,n,e,e,d,2'
    IFS=, read -r first rest <<<"$ELEMENT"
    printf "%s,%sn" "$first" "$rest//,/"




    50,need2


    Get out of the habit of using ALLCAPS variable names. You'll eventually collide with a crucial "system" variable like PATH and break your code.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Mar 26 at 16:00









    glenn jackmanglenn jackman

    53k573114




    53k573114












    • Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

      – Jon Red
      Mar 26 at 16:14






    • 1





      I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

      – glenn jackman
      Mar 26 at 16:17






    • 1





      There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

      – Jeff Schaller
      Mar 26 at 16:19

















    • Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

      – Jon Red
      Mar 26 at 16:14






    • 1





      I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

      – glenn jackman
      Mar 26 at 16:17






    • 1





      There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

      – Jeff Schaller
      Mar 26 at 16:19
















    Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

    – Jon Red
    Mar 26 at 16:14





    Not parameter substitution. BUT, I was unaware that ALLCAPS variable names was a bad habit in Bash. You make a good point, one that a cursory googling definitely confirms. Thank you for improving my style! :)

    – Jon Red
    Mar 26 at 16:14




    1




    1





    I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

    – glenn jackman
    Mar 26 at 16:17





    I've answer questions where the person wrote PATH=something; ls $PATH and then wondered about the ls: command not found error.

    – glenn jackman
    Mar 26 at 16:17




    1




    1





    There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

    – Jeff Schaller
    Mar 26 at 16:19





    There are nearly a hundred built-in variables that are named in all caps (click through this man page link) to see...

    – Jeff Schaller
    Mar 26 at 16:19











    7














    [This is essentially a more fully developed version of glenn jackmann's answer]



    Building an associative array from the stripped key and value, using the first comma as separator:



    declare -A arr
    while IFS=, read -r k v; do arr["$k//[ "]"]="$v//[ ,"]"; done < file.txt
    for k in "$!arr[@]"; do
    printf '|ELEMENT|%s,%s|n' "$k" "$arr[$k]"
    done
    |ELEMENT|20,is|
    |ELEMENT|10,this|
    |ELEMENT|50,need2|
    |ELEMENT|40,I|
    |ELEMENT|60,see|
    |ELEMENT|30,all|





    share|improve this answer



























      7














      [This is essentially a more fully developed version of glenn jackmann's answer]



      Building an associative array from the stripped key and value, using the first comma as separator:



      declare -A arr
      while IFS=, read -r k v; do arr["$k//[ "]"]="$v//[ ,"]"; done < file.txt
      for k in "$!arr[@]"; do
      printf '|ELEMENT|%s,%s|n' "$k" "$arr[$k]"
      done
      |ELEMENT|20,is|
      |ELEMENT|10,this|
      |ELEMENT|50,need2|
      |ELEMENT|40,I|
      |ELEMENT|60,see|
      |ELEMENT|30,all|





      share|improve this answer

























        7












        7








        7







        [This is essentially a more fully developed version of glenn jackmann's answer]



        Building an associative array from the stripped key and value, using the first comma as separator:



        declare -A arr
        while IFS=, read -r k v; do arr["$k//[ "]"]="$v//[ ,"]"; done < file.txt
        for k in "$!arr[@]"; do
        printf '|ELEMENT|%s,%s|n' "$k" "$arr[$k]"
        done
        |ELEMENT|20,is|
        |ELEMENT|10,this|
        |ELEMENT|50,need2|
        |ELEMENT|40,I|
        |ELEMENT|60,see|
        |ELEMENT|30,all|





        share|improve this answer













        [This is essentially a more fully developed version of glenn jackmann's answer]



        Building an associative array from the stripped key and value, using the first comma as separator:



        declare -A arr
        while IFS=, read -r k v; do arr["$k//[ "]"]="$v//[ ,"]"; done < file.txt
        for k in "$!arr[@]"; do
        printf '|ELEMENT|%s,%s|n' "$k" "$arr[$k]"
        done
        |ELEMENT|20,is|
        |ELEMENT|10,this|
        |ELEMENT|50,need2|
        |ELEMENT|40,I|
        |ELEMENT|60,see|
        |ELEMENT|30,all|






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Mar 26 at 16:06









        steeldriversteeldriver

        37.7k45389




        37.7k45389





















            6














            You could loop over the array and use an intermediate variable:



            for((i=0; i < "$#ARRAY[@]"; i++))
            do
            rest="$ARRAY[i]#*,"
            ARRAY[i]="$ARRAY[i]%%,*","$rest//,/"
            done


            This assigns to rest the portion after the first comma; we then concatenate three pieces back into the original variable:



            • the portion before the first comma

            • a comma

            • the replacement in rest of every comma with nothing





            share|improve this answer























            • This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

              – Jon Red
              Mar 26 at 16:26






            • 1





              Fair enough; I just tried to answer within the limitations (parameter expansion only).

              – Jeff Schaller
              Mar 26 at 16:27















            6














            You could loop over the array and use an intermediate variable:



            for((i=0; i < "$#ARRAY[@]"; i++))
            do
            rest="$ARRAY[i]#*,"
            ARRAY[i]="$ARRAY[i]%%,*","$rest//,/"
            done


            This assigns to rest the portion after the first comma; we then concatenate three pieces back into the original variable:



            • the portion before the first comma

            • a comma

            • the replacement in rest of every comma with nothing





            share|improve this answer























            • This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

              – Jon Red
              Mar 26 at 16:26






            • 1





              Fair enough; I just tried to answer within the limitations (parameter expansion only).

              – Jeff Schaller
              Mar 26 at 16:27













            6












            6








            6







            You could loop over the array and use an intermediate variable:



            for((i=0; i < "$#ARRAY[@]"; i++))
            do
            rest="$ARRAY[i]#*,"
            ARRAY[i]="$ARRAY[i]%%,*","$rest//,/"
            done


            This assigns to rest the portion after the first comma; we then concatenate three pieces back into the original variable:



            • the portion before the first comma

            • a comma

            • the replacement in rest of every comma with nothing





            share|improve this answer













            You could loop over the array and use an intermediate variable:



            for((i=0; i < "$#ARRAY[@]"; i++))
            do
            rest="$ARRAY[i]#*,"
            ARRAY[i]="$ARRAY[i]%%,*","$rest//,/"
            done


            This assigns to rest the portion after the first comma; we then concatenate three pieces back into the original variable:



            • the portion before the first comma

            • a comma

            • the replacement in rest of every comma with nothing






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Mar 26 at 16:01









            Jeff SchallerJeff Schaller

            44.6k1162145




            44.6k1162145












            • This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

              – Jon Red
              Mar 26 at 16:26






            • 1





              Fair enough; I just tried to answer within the limitations (parameter expansion only).

              – Jeff Schaller
              Mar 26 at 16:27

















            • This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

              – Jon Red
              Mar 26 at 16:26






            • 1





              Fair enough; I just tried to answer within the limitations (parameter expansion only).

              – Jeff Schaller
              Mar 26 at 16:27
















            This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

            – Jon Red
            Mar 26 at 16:26





            This was my first thought and is simple enough for the example but this is part of larger script where the array is massive and there's already loops and it would be a whole thing. This would definitely work but would be very cumbersome to implement in the larger project I'm working on.

            – Jon Red
            Mar 26 at 16:26




            1




            1





            Fair enough; I just tried to answer within the limitations (parameter expansion only).

            – Jeff Schaller
            Mar 26 at 16:27





            Fair enough; I just tried to answer within the limitations (parameter expansion only).

            – Jeff Schaller
            Mar 26 at 16:27

















            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%2f508777%2fusing-parameter-substitution-on-a-bash-array%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

            Adding axes to figuresAdding axes labels to LaTeX figuresLaTeX equivalent of ConTeXt buffersRotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?TikZ scaling graphic and adjust node position and keep font sizeNumerical conditional within tikz keys?adding axes to shapesAlign axes across subfiguresAdding figures with a certain orderLine up nested tikz enviroments or how to get rid of themAdding axes labels to LaTeX figures

            Luettelo Yhdysvaltain laivaston lentotukialuksista Lähteet | Navigointivalikko

            Gary (muusikko) Sisällysluettelo Historia | Rockin' High | Lähteet | Aiheesta muualla | NavigointivalikkoInfobox OKTuomas "Gary" Keskinen Ancaran kitaristiksiProjekti Rockin' High