テキストファイルを検討してください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
つまり一致戻る終了モードから「最初の」コメントまで - 内部ソリューションが必要な場合、これは明らかにそれほど便利ではありません。