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'FoodFood"Fo"od'Food'Food""Food'Fo'odFo'odFo'odFo"odFo"odFo"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.