私は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{...}{...}flags
extraを使用すると、一致する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
ほとんど意味がありません。