#
最初に追加する必要がある文字列があります。[ -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
。
文字列の
[ -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'
動作しません。
完全な文字列の場合、
[ -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つしかない場合にのみ機能します。とにかく重複するからです。