ディレクトリ内のすべてのファイルで文字列の一部を見つけて置き換える

ディレクトリ内のすべてのファイルで文字列の一部を見つけて置き換える

私のコードベースには次の行があります。

@driver.find_element(:link, "Create").click

時々、「(」と「)」の中に文字列があるかもしれません。

たとえば、@driver.find_element(:name, from_email).click

行を変更したい

@driver.find_element(:link, "Create").click

そして

@driver.find_element(:name, from_email).click

〜のように

click(:link, "Create")

そして

click(:name, from_email)

@driver.find_element私は角かっこと角かっこ内の単語を維持するために交換したいと思いますclick

さまざまなフォルダレベルのファイル間でこれを行う方法はありますか?

答え1

ディレクトリ内のすべてのファイルで文字列の一部を置き換える

探す+sed解決策:

find yourfolder -type f -print0 \
    | xargs -0 sed -i.bak -E 's/@driver\.find_element\(([^()]+)\)\.click/click(\1)/'

答え2

使用sed:

sed 's/@driver.find_element\((:name, from_email)\).click/click\1/;s/@driver.find_element\((:link, "Create")\).click/click\1/'

例:
前のファイル:

cat clickReplace 
@driver.find_element(:link, "Create").click
@driver.find_element(:name, from_email).click
@driver.find_element(:name, foobar).click
@driver.find_element(:link, foobar).click

以降のファイル:

sed 's/@driver.find_element\((:name, from_email)\).click/click\1/;s/@driver.find_element\((:link, "Create")\).click/click\1/' clickReplace 
click(:link, "Create")
click(:name, from_email)
@driver.find_element(:name, foobar).click
@driver.find_element(:link, foobar).click

sed -iファイルを「所定の位置」に変更するために使用されます。

この操作を繰り返し実行するには、findファイルがあるファイルシステムの場所を使用します。たとえば、

find /path/to/files/ -type f -exec \
sed -i 's/@driver.find_element\((:name, from_email)\).click/click\1/;s/@driver.find_element\((:link, "Create")\).click/click\1/' {} +

答え3

拡張正規表現サポート(-rまたは-E)でsedを使用してください。

$ sed -E 's/.*(\(.*\))[.](.*)/\2\1/g' <<<$'@driver.find_element(:link, "Create").click'
click(:link, "Create")

$ sed -E 's/.*(\(.*\))[.](.*)/\2\1/g' <<<$'@driver.find_element(:name, from_email).click'
click(:name, from_email)

クラシックsed、基本正規表現:

$ sed 's/.*\((.*)\)[.]\(.*\)/\2\1/g' <<<$'@driver.find_element(:link, "Create").click'
click(:link, "Create")

awkを使用してください:

$ awk -F'[.(]' '{print $NF "(" $(NF-1)}' <<<$'@driver.find_element(:name, from_email).click'    
click(:name, from_email)

答え4

与えられた一つファイルがある場合、次のsedコマンドはファイルを上書きします。

sed 's/@driver.find_element(\(.*\)).click/click(\1)/' file >file.tmp && 
mv file.tmp file

私たちは、ファイル階層内のすべてのファイルを見つけて、すべてのファイルに対して実行しようとしています。

find . -type f \
    -exec sh -c \
    'for n; do
        sed "s/@driver.find_element(\(.*\)).click/click(\1)/" "$n" >"$n.tmp" &&
        mv "$n.tmp" "$n"
    done' sh {} +

たとえば、特定の名前のファイルのみを*.js変更するには。-name '*.js'-exec

これは.tmp、ファイル名の末尾に追加しても、誤って既存のファイルを上書きしないと仮定します。


sed -i実装間の-i移植が不可能であるため、意図的に使用しません。sed

関連情報