Ini harus melakukannya:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
Di mana in.txt adalah:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
Dan yang diharapkan.txt adalah:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
Anda dapat memeriksa kecocokannya dengan:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
Anda bisa menggunakan tr
:
echo "$string" | tr -d 'chars to delete'
... juga berfungsi, namun 'tr' diketahui bermasalah pada distribusi yang jauh lebih tua (sekitar Redhat 9-ish). tr
adalah singkatan dari 'translate', biasanya digunakan dalam pipa untuk mengubah input. -d
opsi berarti 'hapus'.
Sebagian besar versi modern juga berisi makro yang telah ditentukan sebelumnya untuk mengubah atas ke bawah, bawah ke atas, mematikan ruang putih, dll. Oleh karena itu, jika Anda menggunakannya, luangkan waktu sejenak untuk melihat apa lagi yang dilakukannya (lihat keluaran bantuan / halaman manual), sangat berguna.
VAR="'FOOD'"
VAR=$(eval echo $VAR)
Penjelasan:Karena tanda kutip sudah dipahami oleh shell, Anda dapat meminta shell untuk mengevaluasi perintah yang hanya menggemakan string yang dikutip, dengan cara yang sama saat Anda mengetiknya sendiri.
Di sini, eval echo $VAR
diperluas ke eval echo 'FOOD'
karena tanda kutip sebenarnya adalah bagian dari nilai VAR
. Jika Anda menjalankan echo 'FOOD'
ke dalam shell Anda akan mendapatkan FOOD
(tanpa tanda kutip). Itulah eval
tidak:mengambil inputnya dan menjalankannya seperti perintah shell.
⚠INJEKSI KODE!
eval
memaparkan skrip ke injeksi kode.VAR=';ls -l' VAR=$(eval echo $VAR)
akan menyebabkan eksekusi
ls -l
.Kode yang jauh lebih berbahaya dapat disuntikkan di sini.