動的参照ファイル名

動的参照ファイル名

単一のディレクトリで、各ファイルの最初の行をファイル名に変更したいと思います。各ファイルの最初の行は「TestRelation」です。ファイル名に変更したい。

私はそれをperl -pi -w -e 's/SEARCH_FOR/REPLACE_WITH/g;' *.txtすべてのファイルを閲覧するために使用できることを知っています。しかし、ファイル名の「REPLACE_WITH」を動的に変更するには?

答え1

努力する:

perl -i.bak -wpe 's/SEARCH_FOR/$ARGV/g' *.txt

$ARGVを読むときに現在のファイルの名前が含まれています<>

スイッチを使用しているので-i心配する必要はありません。セキュリティへの影響perl-nまたはスイッチを使用して実行するとき-p

答え2

「ここのドキュメント」を持つシェルスクリプトはこれを見事に扱います。

#!/bin/bash
for NAME in t?
do
ex -s $NAME << END_EDITS
1s/TestRelation/$NAME/
w!
q
END_EDITS
done

ファイル名が何であるかわからないので、「t1」、「t2」、「t3」などをファイル名として選択しました。必要に応じてファイル名を生成する必要があります。

「for」ループは、NAMEループを通過するたびにファイル名の値をシェル変数に提供します。bash上記のスクリプトを実行するインスタンスは、ex各ファイル名のエディタを呼び出し、ここに数行の入力を提供します。 exコマンドは1s/TestRelation/$NAME/インスタンスに展開され、bash「$NAME」部分をファイル名に置き換えます。

END_EDITS行の先頭に空白なしで閉じる「document here」(この場合)タグが必要です。

答え3

このようにしてみてください。

for i in `ls *.sh`; do echo "$i">>$i.new; cat $i.new $i >>$i.new;done

主な機能は、ファイルを一覧表示し、ファイル名を保存することです。この名前を新しいファイルに書き込み、元のファイルと一緒に使用します。必要に応じて、.newファイルを元のファイル名に移動することもできます。最もエレガントなオプションではありませんが、動作します。

答え4

シェルでこれを行うには、findコマンドを使用してファイルを一覧表示し、コマンドを使用してbasenameファイル名を取得し、sed文字列を次のように変更します。

for i  in $(find . -type f); do fname=$(basename $i); sed -i "s/TestRelation/${fname}/" $fname; done

まあbasename、これは必要ありません。検索している特定のディレクトリにのみファイルがあると確信している場合は、find次のものを使用できます。ls

関連情報