私のコードベースには次の行があります。
@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