linux 递归替换文件中的字符串

linux replace string in files recursively

我有一个文件夹,里面装满了 *.java 个文件。它有以下方法:

options.addArguments(//"--no-sandbox", // trying to make browser opening faster, but this argument can have security implications
            "--disable-extensions" // avoid the chrome automation extension crash
            , "--no-proxy-server" // trying to make browser opening faster
            , "--proxy-server='direct://'" // trying to make browser opening faster
            , "--proxy-bypass-list=*" // trying to make browser opening faster
            , "--proxy-server=" // trying to make browser opening faster
            // ,"--blink-settings=imagesEnabled=false" // disable images loading for faster testing
            );

我想更改如下:

options.addArguments("--no-sandbox", // trying to make browser opening faster, but this argument can have security implications
            "--disable-dev-shm-usage"
            , "--disable-extensions" // avoid the chrome automation extension crash
            , "--no-proxy-server" // trying to make browser opening faster
            , "--proxy-server='direct://'" // trying to make browser opening faster
            , "--proxy-bypass-list=*" // trying to make browser opening faster
            , "--proxy-server=" // trying to make browser opening faster
            // ,"--blink-settings=imagesEnabled=false" // disable images loading for faster testing
            );

我在论坛中搜索并找到了一些解决方案,replce string 是我想要的,所以尝试了以下方法:

grep --null -rl //"--no-sandbox" -l | tr '\n' ' ' | xargs --null sed -i 's///"--no-sandbox"/"--no-sandbox",
            "--disable-dev-shm-usage|,/g'

但它抛出以下错误:

sed: -e expression #1, char 6: unknown option to `s'

我猜 old_string 和 new_string 格式是这里的问题。我该如何解决它,或者以更有效和有意义的方式解决它。

你可以试试这个sed

sed '1s|//||;/disable-extensions/{s/           //;s/.*/\t    ,&/};/--no-sandbox/a  \t      "--disable-dev-shm-usage"' input_file

从第 1 行删除 //

添加 , 以符合 disable-extensions

附加disable-dev-shm-usage

输出

options.addArguments("--no-sandbox", // trying to make browser opening faster, but this argument can have security implications
              "--disable-dev-shm-usage"
            , "--disable-extensions" // avoid the chrome automation extension crash
            , "--no-proxy-server" // trying to make browser opening faster
            , "--proxy-server='direct://'" // trying to make browser opening faster
            , "--proxy-bypass-list=*" // trying to make browser opening faster
            , "--proxy-server=" // trying to make browser opening faster
            // ,"--blink-settings=imagesEnabled=false" // disable images loading for faster testing
            );

如果GNU sed可用,如何:

sed -i -zE 's#//("--no-sandbox"[^\n]+\n[[:blank:]]+)#"--disable-dev-shm-usage"\n            , #' file.java

-z 选项 sed 将行分隔符分配给 NUL 字符 这使得可以用换行符分隔整行。

如果您想递归地对 *.java 文件执行相同的替换, 请尝试:

find . -type f -name "*.java" -print0 | xargs -0 sed -i -zE 's#//("--no-sandbox"[^\n]+\n[[:blank:]]+)#"--disable-dev-shm-usage"\n            , #'

由于-i选项强制覆盖原文件,所以测试前请务必备份文件(或将备份后缀放在-i选项中)