最初のイベント以外のすべてのイベントをコメントアウトしてみました。
オリジナルサンプル.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