在目录中的所有文件中查找并替换字符串的一部分

在目录中的所有文件中查找并替换字符串的一部分

在我的代码库中我有这样的行

@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

相关内容