Bash環境でsedコマンドをネストされた部分に分割する方法は?

Bash環境でsedコマンドをネストされた部分に分割する方法は?

私はCentOS Bash環境で作業しており、sedプロのシステム管理者ではない人としてsed少し「混乱する」ほど長いコマンドを持っており、少なくとも2年に1回、少なくとも長いコマンドとして使用します。

read new_email_address
sed -i 's/$to = ".*";$/$to = "'"$new_email_address"'";/' FILE

sedコマンドを次のネストした擬似コードに分割したいと思います。

sed -i
    '
        s/
            $to = ".*";$
        /
            $to = "'"$new_email_address"'";
        /g
    '
FILE_PATH

ベストアンサー1

ここではこれを使いますperl-i非標準オプションなので、一部のsed実装ではそれをコピーしましたが、perl移植可能ではありません。この方法を使用することもsedコマンド注入の脆弱性です。内容が$new_email_address最終的にsedコードとして解釈されるためです(GNU言語には、そのプロンプトに入力しようとするなど、sed任意のコマンドを実行できるコマンドがあります)。/;ereboot;#read

IFS= read -r new_email_address

REPLACEMENT="$new_email_address" perl -pi -e '
  s{
     (\$to \s* = \s* ") .* (" \s* ; \s* )$
   }{$1$ENV{REPLACEMENT}$2}gx
 ' FILE

存在するperl

  • s{...}{...}flagsextraを使用すると、一致するs/.../.../flagsペアをより簡単に確認できます(そして一致する限り、内部使用も許可します){}
  • このxフラグを使用すると、正規表現内にスペース(またはコメント)を追加して読みやすくすることができます(これらのスペースは正規表現の一部ではありませんが、\s*任意の数のスペースと一致します)。
  • &環境変数を使用して、、バックスラッシュ、または改行文字を含む文字列を渡す場合でも、置換に任意の文字列を安全に使用できます。/
  • -C// -Mlocale...-Mopen=localeオプションを使用しない限りperl、バイトレベルで作業するため、入力が.*ロケールで有効なテキストを形成しない場合でも、一致は失敗しません。
  • 一部のsed実装とperlは異なり、行の長さ(使用可能なメモリを除く)に制限はなく、NULバイトを含むか改行文字で終わらない入力をブロックしません。

交換部品にも空白を許可するには、e交換部品をコードにするフラグを追加できますperl

REPLACEMENT="$new_email_address" perl -pi -e '
  s{
     (\$to \s* = \s* ") .* (" \s* ; \s* )$
   }{
     $1 . $ENV{REPLACEMENT} . $2
   }gxe
 ' FILE

例えば。また、read設定なし$IFSとなしを使用することは-rほとんど意味がありません。

おすすめ記事