On 01/31/2022 09:59 PM, H wrote:> On 01/30/2022 11:00 PM, Orion Poplawski wrote: >> On 1/30/22 18:12, H wrote: >>> I am writing a long bash script under CentOS 7 where perl is used for manipulating some external files. So far I am using perl one-liners to do so but ran into a problem when I need to append text to an external file. >>> >>> Here is a simplified example in the bash script where txt is a bash variable which I built containing a longish text with multiple newlines: >>> >>> txt="a b$'\n'cd ef$'\n'g h$'\n'ij kl" >>> >>> A simplified perl one-liner to append the text in the variable above to some file in the bash script would be: >>> >>> perl -pe 'eof && do{print $_'"${txt}"'; exit}' someexternalfile.txt >>> >>> This works when fine when $txt does /not/ contain any spaces but falls apart when it does. >>> >>> I would like to keep the above structure, ie using bash variables to build text strings and one-liners to do the text manipulation. Hopefully there is a "simple" solution to do this, I have tried many variations and failed miserably... Note that I also want to use a similar pattern to do substitutions in external files, I would thus like to use the same code pattern. >> I don't understand why: >> >> echo -e $txt >> someexternalfile.txt >> >> doesn't do what you want, or if perl is absolutely what you need: >> >> perl -e "print \"${txt}\";" >> someexternalfile.txt >> >> I have no idea if you are trying to output literal $'s or 's or not. >> > Thank you, it works! I had forgotten to escape the quotes around my bash variable... >I am still having a problem. The following (where $txt is an arbitrary string) works: perl -e 'print '"\"${txt}\""';' The following does not work (I want to append the content of the $txt to the end of an existing file in-place): perl -i -pe 'eof && do{print $_''\"aaa\"''; exit}' somefile.txt but this does: perl -i -pe "eof && do{print $_""\"${txt}\""'; exit}' somefile.txt as does: perl -i -pe "eof && do{print $_""\"${txt}\"""; exit}" somefile.txt The difference is that the last two perl command strings use " rather than '. My questions are: - Why would not using single-quotes for parts of the perl command string work? - Is there any reason I should fight this or should I just go with double-quotes for all parts of the perl command string? Any downside? Remember, these are all in bash scripts and I am looking for a "pattern" to use for other, more complicated text substitutions, hence the use of perl. Thank you!
On 02/02/2022 08:54 PM, H wrote:> On 01/31/2022 09:59 PM, H wrote: >> On 01/30/2022 11:00 PM, Orion Poplawski wrote: >>> On 1/30/22 18:12, H wrote: >>>> I am writing a long bash script under CentOS 7 where perl is used for manipulating some external files. So far I am using perl one-liners to do so but ran into a problem when I need to append text to an external file. >>>> >>>> Here is a simplified example in the bash script where txt is a bash variable which I built containing a longish text with multiple newlines: >>>> >>>> txt="a b$'\n'cd ef$'\n'g h$'\n'ij kl" >>>> >>>> A simplified perl one-liner to append the text in the variable above to some file in the bash script would be: >>>> >>>> perl -pe 'eof && do{print $_'"${txt}"'; exit}' someexternalfile.txt >>>> >>>> This works when fine when $txt does /not/ contain any spaces but falls apart when it does. >>>> >>>> I would like to keep the above structure, ie using bash variables to build text strings and one-liners to do the text manipulation. Hopefully there is a "simple" solution to do this, I have tried many variations and failed miserably... Note that I also want to use a similar pattern to do substitutions in external files, I would thus like to use the same code pattern. >>> I don't understand why: >>> >>> echo -e $txt >> someexternalfile.txt >>> >>> doesn't do what you want, or if perl is absolutely what you need: >>> >>> perl -e "print \"${txt}\";" >> someexternalfile.txt >>> >>> I have no idea if you are trying to output literal $'s or 's or not. >>> >> Thank you, it works! I had forgotten to escape the quotes around my bash variable... >> > I am still having a problem. The following (where $txt is an arbitrary string) works: > > perl -e 'print '"\"${txt}\""';' > > The following does not work (I want to append the content of the $txt to the end of an existing file in-place): > > perl -i -pe 'eof && do{print $_''\"aaa\"''; exit}' somefile.txt > > but this does: > > perl -i -pe "eof && do{print $_""\"${txt}\""'; exit}' somefile.txt > > as does: > > perl -i -pe "eof && do{print $_""\"${txt}\"""; exit}" somefile.txt > > The difference is that the last two perl command strings use " rather than '. > > My questions are: > > - Why would not using single-quotes for parts of the perl command string work? > > - Is there any reason I should fight this or should I just go with double-quotes for all parts of the perl command string? Any downside? Remember, these are all in bash scripts and I am looking for a "pattern" to use for other, more complicated text substitutions, hence the use of perl. > > Thank you! >I see I made a mistake, the line: perl -i -pe 'eof && do{print $_''\"aaa\"''; exit}' somefile.txt should be: perl -i -pe 'eof && do{print $_''\"${txt}\"''; exit}' somefile.txt Related question, if the $txt string contains eg $ or another special character, what would be the best way of escaping it so it is not substituted by perl? Thank you.
On Wed, Feb 02, 2022 at 08:54:38PM -0500, H wrote:>>>> I am writing a long bash script under CentOS 7 where perl is used for manipulating some external files. So far I am using perl one-liners to do so but ran into a problem when I need to append text to an external file. >>>> >>>> Here is a simplified example in the bash script where txt is a bash variable which I built containing a longish text with multiple newlines: >>>> >>>> txt="a b$'\n'cd ef$'\n'g h$'\n'ij kl" >>>> >>>> A simplified perl one-liner to append the text in the variable above to some file in the bash script would be: >>>> >>>> perl -pe 'eof && do{print $_'"${txt}"'; exit}' someexternalfile.txt >>>> >>>> This works when fine when $txt does /not/ contain any spaces but falls apart when it does.In a shell script why not stick to shell tools? printf "%s" "${txt}" >> someexternalfile.txt -- Jon H. LaBadie jcu at labadie.us