これでうまくいくはずです:
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
が実行されます .
はるかに有害なコードがここに挿入される可能性があります。