为什么我的查找命令不起作用?
Why does my find command not work?
对于我们的 IOS 项目,我想合并旧式 pragma 行,例如
#pragma mark -
#pragma mark Getters
像
这样的单行
#pragma mark - Getters
在网上做了一些研究后,我想到了以下终端命令:
find . -type f -exec awk '{if (sub(/#pragma mark -$/,"#pragma mark -")) printf "%s", [=12=]; else print [=12=]}' {} > {} \;
这是第一个合并两行的命令。然后我会用另一个删除多余的 #pragma mark -
字符。但是,上述命令不会终止。它根本没有改变任何东西。
当您按回车键时,shell 首先处理所有重定向,在本例中为 > {}
。这发生在 shell 为 find
创建进程之前,因为它需要将 find
进程的输出连接到 {}
。这意味着您应该在当前文件夹中找到一个文件 {}
。
我认为在这种情况下你最好使用循环:
find . -type f -print0 | while IFS= read -r -d $'[=10=]' file
do
awk ... "$file" > "$file"
done
但有一个问题:同样,shell 将首先进行重定向。这意味着它将创建一个 empty $file
作为 awk
的输出,然后启动 awk
然后开始读取所述空文件。实现相同目的的更简单方法是 echo -n > "$file"
.
所以你真的需要写入一个临时文件然后重命名:
find . -type f -print0 | while IFS= read -r -d $'[=11=]' file
do
awk ... "$file" > "$file.tmp" && mv "$file.tmp" "$file"
done
并确保在 运行 命令之前备份所有内容,因为它可能会出错。例如,如果您的版本控制中有一个隐藏文件夹,find
将进入该文件夹,然后 awk
将破坏一些重要的位。
PS:如果您使用 IDE,请启用正则表达式并搜索 #pragma mark -\n#pragma mark Getters
。现在你可以用一行替换这两行,你的 IDE 将 95% 确定字符串不会在你不希望它发生的地方被替换。
如果你的awk版本>=4.1.0,你可以
find . -type f -exec awk -i inplace '{if (sub(/#pragma mark -$/,"#pragma mark -")) printf "%s", [=10=]; else print [=10=]}' {} \;
这应该有效:
#!/usr/bin/python
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import re
import sys
array = [] pragmas = [] with open("my.file", "r") as ins:
i = 0
lastPragmaLine = 0
for line in ins:
m = re.search(r'^\s*[#]\s*pragma\s+mark\s+(.*\S)\s*$', line)
if m:
pragmas.append(m.group(1))
lastPragmaLine = i
else:
array.append(line.rstrip('\n\r'))
i += 1
array.insert(lastPragmaLine, '#pragma mark ' + ' '.join(pragmas))
with open("my.output.file", "w") as ins:
for line in array:
print(line, file=ins)
将内容复制到您机器上的 foo.py
和 运行 python foo.py
(假设它有一个 python 解释器,大多数人都有)。
对于我们的 IOS 项目,我想合并旧式 pragma 行,例如
#pragma mark -
#pragma mark Getters
像
这样的单行#pragma mark - Getters
在网上做了一些研究后,我想到了以下终端命令:
find . -type f -exec awk '{if (sub(/#pragma mark -$/,"#pragma mark -")) printf "%s", [=12=]; else print [=12=]}' {} > {} \;
这是第一个合并两行的命令。然后我会用另一个删除多余的 #pragma mark -
字符。但是,上述命令不会终止。它根本没有改变任何东西。
当您按回车键时,shell 首先处理所有重定向,在本例中为 > {}
。这发生在 shell 为 find
创建进程之前,因为它需要将 find
进程的输出连接到 {}
。这意味着您应该在当前文件夹中找到一个文件 {}
。
我认为在这种情况下你最好使用循环:
find . -type f -print0 | while IFS= read -r -d $'[=10=]' file
do
awk ... "$file" > "$file"
done
但有一个问题:同样,shell 将首先进行重定向。这意味着它将创建一个 empty $file
作为 awk
的输出,然后启动 awk
然后开始读取所述空文件。实现相同目的的更简单方法是 echo -n > "$file"
.
所以你真的需要写入一个临时文件然后重命名:
find . -type f -print0 | while IFS= read -r -d $'[=11=]' file
do
awk ... "$file" > "$file.tmp" && mv "$file.tmp" "$file"
done
并确保在 运行 命令之前备份所有内容,因为它可能会出错。例如,如果您的版本控制中有一个隐藏文件夹,find
将进入该文件夹,然后 awk
将破坏一些重要的位。
PS:如果您使用 IDE,请启用正则表达式并搜索 #pragma mark -\n#pragma mark Getters
。现在你可以用一行替换这两行,你的 IDE 将 95% 确定字符串不会在你不希望它发生的地方被替换。
如果你的awk版本>=4.1.0,你可以
find . -type f -exec awk -i inplace '{if (sub(/#pragma mark -$/,"#pragma mark -")) printf "%s", [=10=]; else print [=10=]}' {} \;
这应该有效:
#!/usr/bin/python
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import re
import sys
array = [] pragmas = [] with open("my.file", "r") as ins:
i = 0
lastPragmaLine = 0
for line in ins:
m = re.search(r'^\s*[#]\s*pragma\s+mark\s+(.*\S)\s*$', line)
if m:
pragmas.append(m.group(1))
lastPragmaLine = i
else:
array.append(line.rstrip('\n\r'))
i += 1
array.insert(lastPragmaLine, '#pragma mark ' + ' '.join(pragmas))
with open("my.output.file", "w") as ins:
for line in array:
print(line, file=ins)
将内容复制到您机器上的 foo.py
和 运行 python foo.py
(假设它有一个 python 解释器,大多数人都有)。