単一のディレクトリで、各ファイルの最初の行をファイル名に変更したいと思います。各ファイルの最初の行は「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