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

答え2

簡単な答えは次のとおりです。

sed 's/#[^#]*$//g'

行が終わるまで、#1つ以上の「not」文字が続くものと一致します。#もう少し複雑なものを探しているなら、あなたが正確に何を追求しているのかをもう少し拡張する価値があります。

関連情報