sed не может читать исполняемые файлы при повторении цикла for - PullRequest
0 голосов
/ 20 апреля 2020

В терминальной оболочке я пытаюсь выполнить l oop над набором 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

Почему он может не работать для исполняемых файлов, но работать для других файлов?

1 Ответ

1 голос
/ 20 апреля 2020

Причина, по которой исполняемые файлы не читаются с помощью sed, заключается в том, что у меня ls есть псевдоним ls --color=auto. Следовательно, имена файлов, возвращаемые ls в for для l oop, не просто строки ascii с именем файла, они также содержат информацию о цвете, например:

''$'\033''[01;32mexample_script.py'$'\033''[0m'

, поэтому sed не может найти этот странный файл!

Как указано в комментариях, в этом случае на самом деле нет необходимости использовать ls для создания моего итерируемого списка, и я мог бы вместо этого сделать:

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

или даже без for l oop:

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

Оригинальный ответ : вот мой оригинальный ответ для потомков, сохраненный здесь, потому что это то, что я сделал сам, до помощи комментаторов.

Решение для меня (учитывая, что этот псевдоним установлен) состоит в том, чтобы вместо этого запустить my для l oop, указав ls --color=none, то есть:

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