sedで引用符の中に表示されない限り、#xxxコメントを削除してください。

sedで引用符の中に表示されない限り、#xxxコメントを削除してください。

次の問題を解決するには?入力する

hai this is "#test" #this is comment

質問:シェルスクリプトからコメントのみを削除する方法。予想出力:

hai this is "#test"

ベストアンサー1

GNUまたはFreeBSDの使用sed

$ sed -E 's/^(([^"#]|"(\\.|[^\\"])*")*)#.*/\1/' << EOF
heredoc> hi this is "#test" #this is comment
heredoc> this is test # comment with # characters
heredoc> hi this is "\"test" #this is comment as " was escaped earlier
heredoc> EOF
hi this is "#test"
this is test
hi this is "\"test"

アイデアは、#.*次のシーケンスを一致させることです。

  • "または#()[^"#"]以外の文字
  • または"..."引用符付きの文字列です。...ここでは、次のシーケンスのいずれかです。
    • \x:バックスラッシュの後にランダムな文字(\\.)が続きます。
    • "またはまたは以外の文字です\

POSIXly(いいえ交互に|)オペレータ(しかし、)) 次のように書くことができます。

sed 's/^\(\(\("\(\(\\.\)\{0,1\}[^\"]\)*"\)\{0,1\}[^"#]\)*\)#.*/\1/'

(a|b)*ここでは、EREの代わりにBREを使用します\(a\{0,1\}b\)*。つまり、aまたはシーケンスの代わりにオプションで先行するシーケンスを使用します。bba

おすすめ記事