次の問題を解決するには?入力する
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
またはシーケンスの代わりにオプションで先行するシーケンスを使用します。b
b
a