gpt4 book ai didi

linux - 如何使用 termianl 在 linux 中更改具有相同文件名(例如 : data. txt)的所有子目录中的字符串?

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:16 25 4
gpt4 key购买 nike

find . -name "data.txt" -print0 | grep -rl "pa028" ./ |xargs -0 sed -i '' -e 's/pa028/pa014/g'

我尝试将所有子目录的文件名“data.txt”中的pa028替换为pa014。你能找到请纠正我吗?

最佳答案

您不能将 grep 放在 find -print0xargs -0 之间,因为 grep 在行上运行,并且此管道包含以 null 分隔的文本而不是行。此外,grep -r . 将忽略您如此昂贵地设置 find 以生成的标准输入。

find . -name "data.txt" -exec grep -q "pa028" {} \; -print0 |
xargs -r -0 sed -i '' -e 's/pa028/pa014/g'

这里的逻辑是使用 -exec grep -q 作为 find 的谓词,因此我们生成一个以 null 结尾的匹配文件列表(-exec 返回 true) 传递给 xargs -r -0。 (-r 选项也很重要;如果 xargs 仍然运行,即使 find 没有输出,您也会收到奇怪的错误。)

GNU grep 有一个扩展,可以使用 -z 对以空字符结尾的字符串进行操作,并使用 -Z -l< 打印以空字符结尾的文件名 但这是一个相当新的发展,所以我还不准备推荐它。

关于linux - 如何使用 termianl 在 linux 中更改具有相同文件名(例如 : data. txt)的所有子目录中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42695404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com