gpt4 book ai didi

macos - 执行递归查找并替换为 sed 仅更改第一个文件

转载 作者:行者123 更新时间:2023-12-04 10:45:03 24 4
gpt4 key购买 nike

我试图递归搜索当前目录,在每个 .txt 的第一行执行 sed 替换找到文件。

在 MacOS 上运行这两个命令之一:

find . -name "*.txt" -exec sed -i '' '1 s/([^()]*)//g' {} + 
find . -name '*.txt' -print0 | xargs -0 sed -i '' '1 s/([^()]*)//g'

导致相同的结果。只有找到的“第一个”文件具有 sed对其执行的操作。这似乎是因为 1sed -i '' '1 s/([^()]*)//g' .奇怪的是,即使这导致只使用第一个文件,它仍然只在这个文件的第一行执行 sed 替换;它应该。

如果我将命令更改为此
find . -name '*.txt' -print0 | xargs -0 sed -i '' '2 s/([^()]*)//g'

它仍然只是第一个被更改的文件,但现在第二行有了替换。那么,我的问题是为什么这似乎只影响由返回的第一个文件
find . -name '*.txt' -print0

编辑澄清

我应该通过逐步重新创建问题来澄清我的意思是只有“第一个”文件对其执行了 sed 操作。第一的,

这是文件夹层次结构(注意“文件夹 1”中的空间):
.
├── folder\ 1
│   └── test1.txt
├── folder2
│   └── test2.txt
├── folder3
│   └── test3.txt
└── folder4
└── test4.txt

每个 .txt文件完全包含这一行,而且只有这一行:
This should stay (this should go)
运行上述任一命令时,它是文件 test2.txt那个被改变了,问题是它是唯一被改变的文件!

所以现在,文件包含以下内容:

test1.txt: This should stay (this should go)
test2.txt: This should stay
test3.txt: This should stay (this should go)
test4.txt: This should stay (this should go)
我相信这是因为命令的第一部分,例如
find . -name '*.txt' -print0

给出以下(每个由 \0 空字符分隔)
./folder2/test2.txt./folder3/test3.txt./folder4/test4.txt./folder 1/test1.txt

通过随机更改文件夹和文件名,很明显它总是上面 \0中的第一个文件已更改的分隔列表。

所以问题仍然存在,对 sed 的调用是什么阻止了它在所有文件上被调用?

谢谢!

最佳答案

我想关于第一个命令的问题由 Beta 回答,让我回答第二个。

尝试放 -t (测试)选项 xargs并查看命令行如何
展开:

find . -name '*.txt' -print0 | xargs -0 -t sed -i '' '1 s/([^()]*)//g'

它会输出如下内容:
sed -i '' 1 s/([^()]*)//g ./test1.txt ./test2.txt ./test3.txt ./test4.txt
xargs 的默认行为就是执行指定的命令
( sed 在这种情况下)从标准中读取的所有参数
输入。
另外 sed不会在多个输入文件和 s 中重置行号命令
以上仅适用于第一个文件。

您可以更改 xargs 的行为与 -l1选项:
find . -name '*.txt' -print0 | xargs -0 -l1 -t sed '1 s/([^()]*)//g'

输出:
sed -i '' 1 s/([^()]*)//g ./test1.txt
sed -i '' 1 s/([^()]*)//g ./test2.txt
sed -i '' 1 s/([^()]*)//g ./test3.txt
sed -i '' 1 s/([^()]*)//g ./test4.txt

然后 sed将按预期工作。

关于macos - 执行递归查找并替换为 sed 仅更改第一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59740364/

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