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

Posted

技术标签:

【中文标题】linux递归替换文件中的字符串【英文标题】:linux replace string in files recursively 【发布时间】:2021-11-14 02:25:17 【问题描述】:

我有一个包含 *.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字符串是我想要的所以尝试了以下:

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 格式是这里的问题。我该如何解决它,或者以更有效和更有意义的方式来解决它。

【问题讨论】:

s/pattern/repl/g 将用 repl 替换所有出现的模式。但是s///pattern/repl/g 只是语法错误。 没错,在我的模式中我有 //。但是,我不确定如何将它与字符串一起传递 s|pattern|repl|g 也可以。只需更改分隔符即可。 这里的一个小错误是,如果要替换斜杠或转义文字斜杠,则必须在 sed 中使用不同的分隔符。您尝试的另一个基本问题是,在 grep 看到引号之前,shell 已将其删除。 @tripleee 我该怎么做,你能建议一个方法 【参考方案1】:

你可以试试这个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
            );

【讨论】:

感谢您提供的解决方案,我们可以在“n”个数字文件中递归地进行类似的操作吗?因为这不是我有“//”的代码中唯一的地方。 @ManojKumar 不客气。您可以添加更多数据来显示第二次出现吗?【参考方案2】:

如果GNU sed 可用,如何:

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

sed-z 选项将行分隔符分配给 NUL 字符 这使得能够啜饮由换行符分隔的整行。

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

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

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

【讨论】:

以上是关于linux递归替换文件中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令之sed-替换字符串

linux下批量查询文件内容字符串并替换

用Python在给定目录及其子目录中递归替换文件中的字符串?

使用grep和sed递归查找和替换所有文件中的字符串[重复]

如何在目录树中递归查找和替换所有出现的字符串? [复制]

linux系统批量替换文件中的字符