sed を使用して、最初の項目を除くすべての項目をコメントアウトします。

sed を使用して、最初の項目を除くすべての項目をコメントアウトします。

最初のイベント以外のすべてのイベントをコメントアウトしてみました。

オリジナルサンプル.txt

一つ
二つ
サム
二つ
二つ
#二人

サンプル.txt

一つ
二つ
サム
#二人
##両方
#二人

私は何が起こるのかについてのみ説明できます。使用:

sed -i /two/s/^/#/

ただし、これはすでにコメントアウトされているイベントもコメントアウトします。また、イベントが見つかった行をコメントとして扱います。この問題をどのように解決できますか? Ubuntuの基本イメージでこれをテストしているので、特に何もインストールできません。

答え1

少なくともGNU sed(Ubuntuにはデフォルトである必要があります)を使用すると、0,/pattern/次のことができます。

$ sed '0,/^two/!s//#&/' original.txt 
one
two
three
#two
#two
#two

これは、「0行と最初の一致の間の0行を除くすべての行に対してに置き換え、ちょうど一致した/^two/内容に従います。置換の空のパターンは、以前の正規表現と一致し、一致したものを置き換えます。非/^two/ゴルフバージョン〜する#//&

sed '0,/^two/!s/^two/#two/' original.txt

^two行の先頭に固定されているため、注釈付きイベントと一致しません。いいえ何が欲しいですか?削除してください^

答え2

perl -p -i -e '$_ = ("#" x $count{$_}++) . $_' your-file

期待した結果を作成してください。以前に同じ行が発生した数だけ、各行に#プレフィックスを追加します。

上記のオプションは-iファイルを編集しますn-place(-i一部の実装sedで実際に見つかったオプションは明らかにからコピーされましたperl)。

答え3

sed彼は計算がうまくいかないと悪名高い。以下を使用する方が簡単ですawk

$ awk '/^two/ { if (++count > 1) $0 = "#" $0 }; 1' file
one
two
three
#two
#two
#two

これにより、無視される行を最初に見た後、#文字列で始まる各行の前に文字が追加されます。その後、変更するかどうかにかかわらず、すべての行が印刷されます(two代替コードの尾を介して)。1{ print }

答え4

これはまさにあなたが望むものではありませんが、私があなたを正しく理解しているなら、あなたはコメントアウトされていないアイテムがユニークで、他のすべてのアイテムがコメントアウトされたファイルで終わりたいと思います。これを行う方法はわかりませんが、1つの回避策は元のファイルをそのままにして、独自のファイルを含む別のファイルを作成することです。

$ cat sample.txt | uniq | grep -v ^#  
one
three
two

関連情報