perl + コメントのある行を無視し、一致する単語を含む重複行を削除します。

perl + コメントのある行を無視し、一致する単語を含む重複行を削除します。

私たちは次のようなPerl onelinerを生成します。一致する最初の行を除く二重線を削除するために、構文の2番目の部分は「#」でコメント化された行を無視することです。

例:

# more /tmp/test

     # abra_kadabra

abra_kadabra
abra_kadabra


# perl -i -ne -e'next if /^#/; next if /abra_kadabra/ && ++$ok > 1; print' /tmp/test


# more /tmp/test

     # abra_kadabra

実際、Perl構文は次のように設定してもコメント行を無視しませんnext if /^#/1

私の構文にどのような問題があるかを提案してください。

期待される出力

# more /tmp/test

     # abra_kadabra

abra_kadabra

他の例:

# more /tmp/test

     # abra_kadabra
#       abra_kadabra
abra_kadabra 1
abra_kadabra 2
abra_kadabra 3
abra_kadabra 4

予想出力:

# more /tmp/test

     # abra_kadabra
#       abra_kadabra
abra_kadabra 1

ベストアンサー1

next if /^#/; ...; printで始まる行が#印刷されないことを示します。

ここで欲しい

perl -i -ne 'next if !/^\s*#/ && /abra_kadabra/ && $count++; print' /tmp/test

これがあなたが望むものですいいえnextコメント化された行を保持するには、その行を呼び出します。

sedサポートされている実装と同じです-i-i ''FreeBSDとその派生物を使用):

sed -i -e '/^[[:space:]]*#/b' -e '/abra_kadabra/!b' -e 'x;/./d;g' /tmp/test

私たちはどこで使用しますか?スペアスペースabra_kadabra私たちが以前に会ったことがあることを覚えてください。

おすすめ記事