在我的代码库中我有这样的行
@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