次のファイルがあります
more /tmp/file
number_of_cars_are=$number_of_cars_are
LOG "number_of_cars_are=$number_of_cars_are"
echo "number_of_cars_are are $number_of_cars_are"
grep number_of_cars_are /tmp/test
&で始まる行にのみコメントを付けたいですnumber_of_cars_are=
。その行がすでにコメントである場合、sedはそれを無視する必要があります。
だから私たちは次のことをしました。
sed '/^[^#].*^[[:space:]]*number_of_cars_are=/ s/^/#/' /tmp/file
ただし、number_of_cars_are = $number_of_cars_are行は同じままです。
期待されるパフォーマンス
more /tmp/file
# number_of_cars_are=$number_of_cars_are
LOG "number_of_cars_are=$number_of_cars_are"
echo "number_of_cars_are are $number_of_cars_are"
grep number_of_cars_are /tmp/test
答え1
行を一致させるために使用する正規表現には2つの行開始アンカー(^
)があるため、2番目のアンカーは実際の^
シンボルにのみ一致します。^
before を削除すると、[[:space:]]
式は一致しますが、一致が多すぎます。
# number_of_cars_are=$number_of_cars_are
# LOG "number_of_cars_are=$number_of_cars_are"
LOG "
一致する.*
ので許可されます。式の先頭を削除します。
sed '/^[[:space:]]*number_of_cars_are=/ s/^/#/'
これは空白文字(なしを含む)で始まり、それに続くすべての行と一致しますnumber_of_cars_are=
。これにより、コメント行は一致しないため再処理されず、 で直ちに始まる行がnumber
一致します。