同じ行番号を持つディレクトリ内のすべてのファイルを削除する方法は?

同じ行番号を持つディレクトリ内のすべてのファイルを削除する方法は?

ディレクトリ内のすべての.fastaファイルから151から154行を削除したいと思います。頑張ってる

find . -type f -exec sed -i.fix '151,154d' '{}' '+' 

ただし、他の400ファイルではなく、最初のファイルでのみ実行されます。

ベストアンサー1

-i非標準sedオプションです。それはから来るperl。 GNUとFreeBSDは、sed動作をエミュレートするために2001年末と2002年初めに独立して追加されましたが、インターフェースは異なります。より多くの変更(特に元のファイルメタデータが保持される程度に関して)があったので、より多くの実装が行われました。-iperl

では、perl次の操作を行います。

perl -ni.back -e 'print unless $. == 151..154' file

$.現在行番号です現在の入力ファイルハンドル。 /を使用すると、<>引数として渡されたファイルごとにファイルハンドルが開きますが、各ファイル間で閉じられないため、各ファイル間でリセットされません。これを行うには、次のものが必要です。-nARGVARGV$.

perl -ni.back -e '
  print unless $. == 151..154;
  close ARGV if eof' file1 file2

GNUは、à laオプション(2001-09-25に追加されましたが、1年後(3.95)までリリースされていません)を追加したsed最初の実装(AFAIK)でした。このオプションは、各ファイル間の行番号をリセットします(他のGNU拡張を意味します)。 。-iperl-s

FreeBSD別のことをしました。。 GNUの元のAPIとFreeBSDの主な違いは、-iFreeBSDではパラメータが必須であるのに対して、GNUではsed同様のオプションですperl。 FreeBSDでは、最初は各ファイル間の行番号はリセットされません。

2007年、FreeBSDはsed2番目の点でGNUと一致します。。各ファイル間の行番号がリセットされ-Iました-i

-iBusybox、NetBSD、OpenBSDなどの他の実装によってはるかに後でサポートが追加されsedましたが、sed両方の点でGNUと一致します。

macOSはsed以前のバージョンのFreeBSDに基づいているため、現在のバージョンのFreeBSDと同じように動作する唯一の実装である可能性があり、現在使用されている実装かもしれません。

したがって、ここでは次のものを使用する必要がありますperl

find . -type f ! -name '*.back' -exec perl -ni.back -ne '
  print unless $. == 151..154;
  close ARGV if eof' {} +

または、sed各ファイルに対して1つずつ呼び出します。

find . -type f ! -name '*.back' -exec sed -i.back 151,154d {} \;

sedGNUまたはGNUをインストールして使用するかawk(代わりに-i /usr/share/awk/inplace.awk1を使用して一致)、またはFNRNRed/ex方法に応じて


^使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

おすすめ記事