これでうまくいくはずです:
sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt
in.txt の場所:
"Fo'od'
'Food'
"Food"
"Fo"od'
Food
'Food"
"Food'
'Fo'od'
"Fo'od"
Fo'od
'Fo"od'
"Fo"od"
Fo"od
そして expected.txt は:
"Fo'od'
Food
Food
"Fo"od'
Food
'Food"
"Food'
Fo'od
Fo'od
Fo'od
Fo"od
Fo"od
Fo"od
それらが一致することを確認できます:
diff -s <(sed "s/^\([\"']\)\(.*\)\1\$/\2/g" in.txt) expected.txt
tr を使用できます :
echo "$string" | tr -d 'chars to delete'
...も機能しますが、「tr」は、はるかに古い(Redhat 9程度の)ディストリビューションでは問題があることが知られています。 tr 'translate' の省略形で、入力を変換するためにパイプで一般的に使用されます。 -d オプションは単に「削除」を意味します。
最近のほとんどのバージョンには、上から下へ、下から上へ、空白を削除するなどの定義済みマクロも含まれています。
VAR="'FOOD'"
VAR=$(eval echo $VAR)
説明:引用符はシェルによって既に理解されているため、引用符で囲まれた文字列をエコーするだけのコマンドを評価するようにシェルに依頼できます。これは、自分で入力した場合と同じ方法です。
ここでは、eval echo $VAR eval echo 'FOOD' に展開します 引用符は実際には VAR の値の一部であるため . echo 'FOOD' を実行した場合 FOOD を取得するシェルに (引用符なし)。それが eval です する:入力を受け取り、シェル コマンドのように実行します。
⚠コードインジェクション!
eval スクリプトをコード インジェクションにさらす。
VAR=';ls -l'
VAR=$(eval echo $VAR)
ls -l が実行されます .
はるかに有害なコードがここに挿入される可能性があります。