Преобразование содержимого файла в нижний регистр и сохранение результата в том же файле

Я использую следующую команду для преобразования содержимого входного файла в нижний регистр

tr AZ az < input > output 

Эта команда работает нормально.

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

  tr AZ az < input > input 

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

Поскольку > input приводит к тому, что оболочка обрезает файл перед запуском команды tr . Кстати, вы можете обойти это с более сложной обработкой дескрипторов в Bash :

 exec 8<>input exec 9<>input tr '[AZ]' '[az]' <&8 >&9 

exec #<>file открывает файл в дескрипторе # в режиме чтения-записи без усечения.

Если у вас есть GNU sed вы можете использовать

 sed -i 's/.*/\L&/' input 
  • -i изменить файл на месте
  • s/old/new/ replace old с new
  • .* любые символы на каждой строке
  • \L нижнем регистре
  • & согласованный шаблон