順次変数を使用してパターン発生を検索して置き換えます。

順次変数を使用してパターン発生を検索して置き換えます。

複数のファイル/サブディレクトリで変数を更新する必要があります。置換される変数は同じ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)

関連情報