Stripping single and double quotes in a string using bash / standard Linux commands only
This should do it:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Where in.txt is:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
And expected.txt is:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
You can check they match with:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
You could use tr
:
echo "$string" | tr -d 'chars to delete'
... also works, however 'tr' is known to be problematic on much older (circa Redhat 9-ish) distributions. tr
is an abbreviation for 'translate', commonly used in pipes to transform input. The -d
option simply means 'delete'.
Most modern versions also contain predefined macros to transform upper to lower, lower to upper, kill white space, etc. Hence, if you use it, take a second to poke at what else it does (see the help output / man page), comes in handy.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Explanation: Since quotes are already understood by the shell you can ask the shell to evaluate a command that just echos the quoted string, the same way it does when you type it yourself.
Here, eval echo $VAR
expands to eval echo 'FOOD'
because the quotes are actually part of the value of VAR
. If you were to run echo 'FOOD'
into the shell you'd get FOOD
(without the quotes). That's what eval
does: it takes its input and runs it like a shell command.
⚠CODE INJECTION!
eval
expose scripts to code injection.VAR=';ls -l' VAR=$(eval echo $VAR)
will cause execution of
ls -l
.Much more harmful codes could be injected here.