【问题标题】:linux replace string in files recursivelylinux递归替换文件中的字符串
【发布时间】:2023-03-04 00:42:01
【问题描述】:

我有一个包含 *.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 我该怎么做,你能建议一个方法

标签: linux string sed replace grep


【解决方案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 选项中)。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2017-04-24
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2013-08-21
    • 2016-10-02
    相关资源
    最近更新 更多