SED正規表現でbashの拡張:ケース句除去X = '\ .Bを'; Y = ';;' SED -n '/ $ {X} /、/ $ {Y} / D'
-
26-09-2019 - |
質問
私はbashスクリプトからケース句を削除しようとしています。句が異なりますが、常に大文字一致文字列の一部としてバックスラッシュを持つことになります。
私はsedをしようとしていたが、bashスクリプト内のawkやperlのワンライナーを使用することができます。
編集のターゲットは簡単です、次のようになります。
$cat t.sh
case N in
a\.b);
#[..etc., varies]
;;
esac
私はバックスラッシュ、セミコロン、またはその両方をエスケープ変数展開の抵触実行しています。 I「のeval」の場合、私は私のバックスラッシュエスケープを取り除きます。私がいない場合は、セミコロンは私を追いつきます。だから私は、sedの内サブシェル拡張を試してみました。私はそれを書いたので、これはインタプリタをファウル。もっとセミコロンをエスケープすることは助けには思えません。
X='a\.b' ; Y=';;'
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh
そして、これます:
perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh # which empties t.sh
と
eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh # which does nothing
解決
バッシュのprintf
が役立つ引用機能があります:
X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh
または、あなたはさらにprintf
変数割り当て機能を使用することができます
printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh
sed
コマンドの引数を二重引用符の使用に注意してください。単一引用符は、変数やコマンド置換の拡大を防ぐことができます。それらが使用されていない場合は、しかし、それは単一引用符を使用するのがベストです。
他のヒント
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh
このシェルが引用してゲームをプレイしているが、それはかなりうまく動作します。 :)
所属していません StackOverflow