sed コマンドは e フラグで動作しますが、E とは動作しません。

sed コマンドは e フラグで動作しますが、E とは動作しません。

#最初に追加する必要がある文字列があります。[ -n "$ID" -a "$ID" -le 200 ] && returnつまり#[ -n "$ID" -a "$ID" -le 200 ] && return、次のコマンドを使用できます。

echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -e 's/\[ -n "$ID" -a "$ID" -le 200 \] && return/#&/p'

効果がある今フラグについて2つの質問がありますE

  1. 文字列の[ -n "$ID" -a "$ID" -le 200 ]場合、角かっこをエスケープしても機能しません。しかし、エスケープしないと動作します。

    sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
    

    同時に作業

     sed -n -E 's/\[ -n "$ID" -a "$ID" -le 200 \]/#&/p'
    

    動作しません。

  2. 完全な文字列の場合、[ -n "$ID" -a "$ID" -le 200 ] && returnエスケープしないと誤った答えが与えられます。

    echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ] && return/#&/p'
    

    それは私に出力を与えます:

     [ -n "$ID" -a "$ID" -le 200 #] && return
    

どのように動作するか知りたいです。

答え1

sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'

期待どおりに動作しません。これは偶然に近いです。[...]一致する文字セットです。このセットでは、範囲-nはスペース(0x20)から(0x6E)までで、ロケールに応じて(0x5B)をn含めることができます。[したがって、セットは最初の文字と一致します。#&___代替の役割をすればどうなるのか見て…そんな意図ではないようですが?

これがケース全体が失敗する理由です。セットに一致する文字は、パターン]の残りの部分が後に続くので、その#文字がそこに挿入される理由です。

拡張正規表現の問題は@steeldriver仮定:$アンカーパターンと同じです。

角かっこ式の外側の ( '$' ) は、閉じた式またはサブ式を文字列の末尾に固定します。これらの式またはサブ式は、文字列シーケンスの最後の文字で終わる式とのみ一致できます。たとえば、ERE "ef$"と "(ef$)"は文字列 "abcdef"の "ef"と一致しますが、 "cdefab"文字列では失敗し、ERE "e$f"は機能しますが一致しません。 「f」は、「e $」式が最後の文字で終わる内容と一致するのを防ぐためです。

したがって、EREではリテラルを$エスケープする必要がありますが、BREではパターンの最後の文字である場合にのみエスケープする必要があります。

また、-e次のパラメータはスクリプトとして表示されます。スクリプトが1つしかない場合、このパラメータはオプションですが-Eスイッチです。-e「-E」の削除は、スクリプトが1つしかない場合にのみ機能します。とにかく重複するからです。

関連情報