Mělo by to stačit:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Kde je in.txt:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
A očekávaný.txt je:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Můžete zkontrolovat, zda se shodují s:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Můžete použít tr
:
echo "$string" | tr -d 'chars to delete'
... také funguje, nicméně je známo, že 'tr' je problematické na mnohem starších (cca Redhat 9-ish) distribucích. tr
je zkratka pro 'přeložit', běžně používaná v potrubí k transformaci vstupu. -d
volba jednoduše znamená 'smazat'.
Většina moderních verzí také obsahuje předdefinovaná makra pro transformaci horního na dolní, dolní na horní, zabití prázdného místa atd. Pokud to tedy používáte, chvíli se dívejte na to, co ještě dělá (viz výstup nápovědy / manuálová stránka), přijde vhod.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Vysvětlení:Vzhledem k tomu, že shell již rozumí uvozovkám, můžete shell požádat, aby vyhodnotil příkaz, který pouze opakuje řetězec v uvozovkách, stejným způsobem, jako když jej napíšete sami.
Zde eval echo $VAR
expanduje na eval echo 'FOOD'
protože uvozovky jsou ve skutečnosti součástí hodnoty VAR
. Pokud byste spustili echo 'FOOD'
do shellu byste dostali FOOD
(bez uvozovek). To je to, co eval
dělá:vezme jeho vstup a spustí jej jako příkaz shellu.
⚠INJEKCE KÓDU!
eval
vystavit skripty vkládání kódu.VAR=';ls -l' VAR=$(eval echo $VAR)
způsobí spuštění
ls -l
.Dalo by se sem vložit mnohem více škodlivých kódů.