最後のコメント化された行から「foo」がある行まで、すべての行にコメントを付けました。

最後のコメント化された行から「foo」がある行まで、すべての行にコメントを付けました。

テキストファイルを検討してくださいusers.txt

#alice
#bob
charlie
dotan
eric

最後のコメント付き行(除外)から(含む)まで、すべての内容をコメントアウトする必要がありますdotan。結果は次のとおりです。

#alice
#bob
#charlie
#dotan
eric

sedこれを行うための良いオネライナーはありますか?私は本当に本当にどんなツールにも満足していますsed

現在、次のように最後のコメントが付いた行の行番号が表示されます。

$ cat -n users.txt | grep '#' | tail -n1
  2 #bob

その後、1つを追加してコメントを残しますsed

$ sed -i'' '3,/dotan/ s/^/#/' users.txt

私は賢く、すべてを何かと組み合わせてbc醜いジョークにすることができることがわかりました。確かにもっときれいな方法が必要ですか?

ベストアンサー1

既存のコメント行が連続ブロックを形成している場合は、次から始めることができます。最初代わりに、まだコメントアウトされていない終了パターンまでのみコメントアウトして行をコメントアウトします。

sed '/^#/,/dotan/ s/^[^#]/#&/' file

既存のコメントが連続していない場合は、sedの範囲マッチングの貪欲な性質のため、このようなことを行う必要があるようです。

tac file | sed '/dotan/,/^#/ s/^[^#]/#&/' | tac

つまり一致戻る終了モードから「最初の」コメントまで - 内部ソリューションが必要な場合、これは明らかにそれほど便利ではありません。

おすすめ記事