sed 在循环中迭代时无法读取可执行文件



在一个终端shell中,我试图在一组Python文件上循环,并用sed执行查找和替换,例如:

$ for f in `ls *.py`; do sed -i 's|foo|bar|g' $f; done;

然而,对于一些文件(尤其是那些我更改为可执行的Python脚本(,它给出了错误:

sed: can't read example_script.py: No such file or directory

为什么它可能不适用于可执行文件,而适用于其他文件?

sed没有读取可执行文件的原因是我的ls别名为ls --color=auto。因此,ls在for循环中返回的文件名不仅仅是带有文件名的ascii字符串,它们还包含颜色信息,例如:
''$'33''[01;32mexample_script.py'$'33''[0m'

所以sed找不到这个奇怪的文件!

正如评论中所指出的,在这种情况下,实际上不需要使用ls来创建我的可迭代列表,我可以改为:

$ for f in *.py; do sed -i 's|foo|bar|g' "$f"; done;

甚至没有for循环:

$ sed -i 's|foo|bar|g' *.py

原始答案:这是我留给子孙后代的原始答案,之所以保留在这里,是因为这是我自己在评论帮助之前所做的。

对我来说(假设设置了这个别名(的解决方案是运行我的for循环,确保指定ls --color=none,即:

$ for f in `ls --color=none *.py`; do sed -i 's|foo|bar|g' $f; done;

相关内容

  • 没有找到相关文章

最新更新