私たちは次のような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
私たちが以前に会ったことがあることを覚えてください。