ディレクトリ内のすべての.fastaファイルから151から154行を削除したいと思います。頑張ってる
find . -type f -exec sed -i.fix '151,154d' '{}' '+'
ただし、他の400ファイルではなく、最初のファイルでのみ実行されます。
ベストアンサー1
-i
非標準sed
オプションです。それはから来るperl
。 GNUとFreeBSDは、sed
動作をエミュレートするために2001年末と2002年初めに独立して追加されましたが、インターフェースは異なります。より多くの変更(特に元のファイルメタデータが保持される程度に関して)があったので、より多くの実装が行われました。-i
perl
では、perl
次の操作を行います。
perl -ni.back -e 'print unless $. == 151..154' file
$.
現在行番号です現在の入力ファイルハンドル。 /を使用すると、<>
引数として渡されたファイルごとにファイルハンドルが開きますが、各ファイル間で閉じられないため、各ファイル間でリセットされません。これを行うには、次のものが必要です。-n
ARGV
ARGV
$.
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拡張を意味します)。 。-i
perl
-s
FreeBSD別のことをしました。。 GNUの元のAPIとFreeBSDの主な違いは、-i
FreeBSDではパラメータが必須であるのに対して、GNUではsed
同様のオプションですperl
。 FreeBSDでは、最初は各ファイル間の行番号はリセットされません。
2007年、FreeBSDはsed
2番目の点でGNUと一致します。。各ファイル間の行番号がリセットされ-I
ました-i
。
-i
Busybox、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 {} \;
sed
GNUまたはGNUをインストールして使用するかawk
(代わりに-i /usr/share/awk/inplace.awk
1を使用して一致)、またはFNR
NR
ed
/ex
方法に応じて。
^使用しないでください-i inplace
現在の作業ディレクトリから最初に拡張機能をgawk
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'