SED正規表現でbashの拡張:ケース句除去X = '\ .Bを'; Y = ';;' SED -n '/ $ {X} /、/ $ {Y} / D'

StackOverflow https://stackoverflow.com/questions/3009202

質問

私は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

このシェルが引用してゲームをプレイしているが、それはかなりうまく動作します。 :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top