Команда expand

Команда expand позволяет задействовать одноименную утилиту, предназначенную для замены символов табуляции на символы пробелов в текстовых файлах. Необходимость в выполнении описанной операции возникает крайне редко, главным образом при работе с исходным кодом программных компонентов, тем не менее, о существовании рассматриваемой утилиты все же стоит знать. Кроме того, следует знать о том, что существует команда, работающая ровно противоположным образом — это команда unexpand.

Базовый синтаксис команды выглядит следующим образом:

$ expand [параметры] имя-файла

Очевидно, что по умолчанию утилита выводит обработанное содержимое текстового файла с помощью стандартного потока вывода. Если вам понадобится сохранить его в отдельном файле, вы можете воспользоваться функцией перенаправления вывода командной оболочки (как вы наверняка помните, символ > позволяет перенаправить стандартный поток вывода утилиты в файл с заданным именем с предварительным удалением содержимого этого файла в случае его существования, а последовательность символов >> - дописать данные из стандартного потока вывода утилиты в конец существующего текстового файла с заданным именем). Утилита поддерживает небольшое количество параметров, причем наиболее важными являются параметр -i, позволяющий заменять лишь начальные символы табуляции в строках (то есть, те символы, перед которыми не расположено каких-либо отличных от символов табуляции символов) и параметр -t, позволяющий задать количество пробелов, используемое при замене каждого из символов табуляции.

Примеры использования

Замена символов табуляции на символы пробелов в исходном коде программы

Предположим, что у нас имеется файл исходного кода sample1.c со следующим содержимым:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void say_hello(void)
  5. {
  6.         char *username;
  7.  
  8.         username = getenv("USERNAME");
  9.  
  10.         if (username != NULL) {
  11.                 printf("Hello, %s\n", username);
  12.         } else {
  13.                 printf("Hello, Alex\n");
  14.         }
  15. }
  16.  
  17. int main (int argc, char** argv)
  18. {
  19.         say_hello();
  20.        
  21.         return 0;
  22. }

Несложно заметить, что для обозначения отступов в нем используются символы табуляции. Если же нам понадобится заменить каждый из начальных символов табуляции на последовательность из двух пробелов, нам придется воспользоваться следующей командой:

$ expand -i -t 2 sample1.c > sample2.c

В результате в директории с файлом sample1.c будет создан файл sample2.c, в котором каждый начальный символ табуляции будет заменен на два пробела. Параметр -i используется для указания на то, что нужно заменять лишь начальные символы табуляции, а параметр -t 2 — для указания на то, что каждый символ табуляции должен заменяться на два символа пробела. А это содержимое результирующего файла sample2.c:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void say_hello(void)
  5. {
  6.   char *username;
  7.  
  8.   username = getenv("USERNAME");
  9.  
  10.   if (username != NULL) {
  11.     printf("Hello, %s\n", username);
  12.   } else {
  13.     printf("Hello, Alex\n");
  14.   }
  15. }
  16.  
  17. int main (int argc, char** argv)
  18. {
  19.   say_hello();
  20.  
  21.   return 0;
  22. }

Очевидно, что утилита не осуществила преобразования каких-либо символов за исключением символов табуляции, следовательно программа будет корректно компилироваться и функционировать.