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递归替换文件中的字符串的主要内容,如果未能解决你的问题,请参考以下文章
用Python在给定目录及其子目录中递归替换文件中的字符串?