bashの正規表現sedをエスケープします(小文字1個、大文字1個、記号1個、数字1個)。

bashの正規表現sedをエスケープします(小文字1個、大文字1個、記号1個、数字1個)。

目的は、大文字1個、小文字1個、特殊文字1個、数字1個を含まないファイルのすべての行を削除することです。

この正規表現を実行できません。

(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$

bashコマンドに示されているように:

sed -ri '\/(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$\/!d' rh.txt

エラーは次のとおりです。

sed: -e expression #1, char 67: unterminated address regex

何から逃げるべきかわかりません。

助けが必要ですか?

答え1

sedこの目的には使用しないでくださいgrep。この方法で PCRE スタイル表現を使用できますsed(PCRE を使用しません)。

grep -v -P '^(?=.*pattern1)(?=.*pattern2)'

答え2

スラッシュをエスケープし//アドレスパターンの区切り文字になっていないため、エラーが発生します。

これで、エスケープしなくても/正規表現は機能しません。そして一部の実装でのみsedサポートされています(次のPOSIXバージョンでは標準になる予定です)。または、正規表現で使用されているプレビュー機能はサポートされていません。BREEREBREERE(?=...)

リクエストを送信:

LC_ALL=C sed -e '
  /[A-Z]/!d
  /[a-z]/!d
  /[0-9]/!d
  /[#?!@$%^&*-]/!d
' <file

答え3

利用可能なソリューションの使用sed:

sed -n '/[A-Z]/{/[a-z]/{/[0-9]/{/[#?!@$%^&*-]/p}}}'

関連情報