複数のファイル/サブディレクトリで変数を更新する必要があります。置換される変数は同じ6文字で始まり、それ以降のすべての変数はランダムです。最初の6文字を検索/置換パターンとして使用します。次のランダムな文字を順次変数に置き換えます。
どのユーティリティがこれに最も適しているかはわかりませんが、sedがある種のループにあると想像してください。私はこれを達成するための最良の方法を想像しようとしています。私はこれが次のようになることができると想像しています。
#!/bin/bash
i=0
grep -r '/parent/sub/' -e 'pattern' | while read line
do
sed 's/pattern*/pattern$i/g'
((i++))
done
私の最初の質問は、sedがこのように使用できるかどうかわからず、2番目にループに入れ子になっているので、grepコマンドで必要な行をどのように提供します(またはここでgrepより良い方法がありますか)。使用?)
ありがとう
答え1
次のスクリプトが操作を実行します。
#!/bin/bash
i=0
grep -rl --exclude=${0:2} . -e pattern | while read -r line
do
sed -i 's/pattern\(.*\)/pattern'$i'/' "$line"
((i++))
done
このwhile
ループは、「パターン」インスタンスを含む現在のディレクトリのすべてのファイル名を繰り返します(サブフォルダでも繰り返し)。を使用すると、sed
行内の 'pattern'の後のすべての項目を置き換えることができます(\(.*\)
group、 'pattern'、およびcounterの値で表されますi
)。
メモ:
- これは、異なる行に多数の「パターン」文字列がある場合にも機能しますが、「パターン」の後のすべての文字列が置き換えられるため、同じ行に複数の「パターン」文字列がある場合は機能しません。
sed -i
ファイルを所定の位置に置き換え、ファイルがすべてを正しく置き換えていることを確認するには、削除してください-i
。--exclude=${0:2}
grep
そのオプションを使用せずに現在のディレクトリから検索すると、「pattern」文字列が含まれているため、スクリプトファイル名とも一致するため、そのオプションを呼び出しに追加しました!
答え2
このツールは使用されます探すfind
代わりに、ファイル名はgrep
ツール名に大きなヒントがあります。grep
あるG世界中で一つを探す右定期的な第二ファイル/ストリームの式と人ed
印刷結果 - コマンドの文字ですg/re/p
。 GNUの人々はgrep
ファイルを見つけるためのオプションを提供することによって本当に台無しにされました。うまくいけば、彼らはsort、tr、sed、wcなどを使用する予定がないことを願っています!
以下は、目的のタスクを実行する強力な方法です(いつ、パターンの意味、パターンに含めることができる文字などを増やしたいとします)。
i=0
while IFS= read -rd '' file; do
grep -q 'pattern' "$file" &&
sed -i 's/pattern*/pattern'"$i"'/g' "$file"
((i++))
done < <(find '/parent/sub/' -type f -print0)