Линукс удалить все пробелы из файла

Обновлено: 03.07.2024

Но условный код всегда выполняется, потому что hg st всегда печатает хотя бы один символ новой строки.

  • Есть ли простой способ убрать пробелы из $var (как trim() в PHP )?
  • Есть ли стандартный способ решения этой проблемы?

Я мог бы использовать sed или AWK , но я хотел бы думать, что есть более элегантное решение этой проблемы.

Связанные, если вы хотите обрезать пространство на целое число и просто получить целое число, оберните с $ (($ var)), и даже можете сделать это, когда внутри двойных кавычек. Это стало важным, когда я использовал оператор даты и с именами файлов. Если это поможет, по крайней мере, где я тестирую это на Ubuntu 16.04. Используя следующие матчи подрезать во всех отношениях: echo " This is a string of char " | xargs . Однако , если вы имеете апостроф в тексте вы можете сделать следующее: echo " This i's a string of char " | xargs -0 . Обратите внимание, что я упоминаю последний из xargs (4.6.0) Условие не выполняется из-за новой строки, поскольку обратные метки поглощают последнюю новую строку. Это ничего не будет печатать test=`echo`; if [ -n "$test" ]; then echo "Not empty"; fi , однако это будет test=`echo "a"`; if [ -n "$test" ]; then echo "Not empty"; fi - поэтому в конце должно быть больше, чем просто перевод строки.

Давайте определим переменную, содержащую начальные, конечные и промежуточные пробелы:

Как удалить все пробелы (обозначено [:space:] в tr ):

Как удалить только первые пробелы:

Как удалить только конечные пробелы:

Как убрать как начальные, так и конечные пробелы - объедините sed :

С другой стороны , если ваш Баш поддерживает его, вы можете заменить echo -e "$" | sed . с sed . <<<$ , например , так (для конечных пробелов):

Обобщая решение для обработки всех форм пробелов, заменить символ пробела в tr и sed команде с [[:space:]] . Обратите внимание, что этот sed подход будет работать только на однострочном вводе. Подходы, которые работают с многострочным вводом, а также используют встроенные функции bash, см. В ответах @bashfu и @GuruM. Обобщенная, встроенная версия решения @Nicholas Sushkin будет выглядеть так: trimmed=$([[ " test test test " = Если вы делаете это часто, добавление alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'" к вашему

/.profile позволяет вам использовать echo $SOMEVAR | trim и cat somefile | trim .

Я написал sed решение , которое использует только одно выражение , а не два: sed -r 's/^\s*(\S+(\s+\S+)*)\s*$/\1/' . Он обрезает начальные и конечные пробелы и фиксирует любые разделенные пробелами последовательности непробельных символов в середине. Наслаждайтесь! @VictorZamanian Ваше решение не работает, если входные данные содержат только пробелы. Решения Sed с двумя шаблонами, предоставленные MattyV и instanceof, прекрасно работают с вводом только пробелов. @ Торбен Справедливая точка. Я полагаю, что одно выражение можно сделать условным, | чтобы сохранить его как одно, а не несколько выражений.

Xargs сделает обрезку для вас. Это одна команда / программа, без параметров, которая возвращает обрезанную строку, просто!

Примечание: это не удаляет все внутренние пробелы, поэтому "foo bar" остается неизменным; это НЕ становится "foobar" . Тем не менее, несколько пробелов будут сжаты в единичные пробелы, поэтому "foo bar" станет "foo bar" . Кроме того, он не удаляет символы конца строки.

Ницца. Это работает очень хорошо. Я решил xargs echo передать это просто, чтобы быть многословным о том, что я делаю, но xargs сам по себе будет использовать echo по умолчанию. Хороший трюк, но будьте осторожны, вы можете использовать его для однострочной строки, но - благодаря дизайну xargs - он не просто будет работать с многострочным канальным контентом. Сед твой друг тогда. Единственная проблема с xargs состоит в том, что он вводит новую строку, если вы хотите, чтобы новая строка была отключена, я бы порекомендовал sed 's/ *$//' в качестве альтернативы. Вы можете увидеть xargs новую строку следующим образом: echo -n "hey thiss " | xargs | hexdump вы заметите, 0a73 что a это новая строка. Если вы сделаете то же самое с sed : echo -n "hey thiss " | sed 's/ *$//' | hexdump вы увидите 0073 , нет новой строки. Осторожный; это сломается, если строка в xargs содержит лишние пробелы между ними. Как «это один аргумент». xargs разделит на четыре. Это плохо. 1. Это превратится a<space><space>b в a<space>b . 2. Еще больше: оно превратится a"b"c'd'e в abcde . 3. Еще больше: он не включится a"b и т. Д.

Существует решение, которое использует только встроенные модули Bash, называемые подстановочными знаками :

Вы передаете строку для обрезки в кавычки. например:

Приятной особенностью этого решения является то, что оно будет работать с любой POSIX-совместимой оболочкой.

Ссылка

Я не обнаружил никаких нежелательных побочных эффектов, и основной код работает и с другими POSIX-подобными оболочками. Однако в Solaris 10 он не работает /bin/sh (только с /usr/xpg4/bin/sh , но это не то, что будет использоваться с обычными sh-скриптами). Намного лучшее решение, чем использование sed, tr и т. Д., Так как это намного быстрее, избегая использования fork (). На Cygwin разница в скорости составляет порядки величины. В подавляющем большинстве это идеальное решение. Ветвление один или несколько внешних процессов (например, awk , sed , tr , xargs ) просто обрезки пробельного из одной строки в корне безумен - особенно , когда большинство оболочек ( в том числе Баша) уже обеспечивает встроенную строку munging объектов вне коробки.

В Bash есть функция, называемая расширением параметров , которая, помимо прочего, позволяет заменять строки на основе так называемых шаблонов (шаблоны напоминают регулярные выражения, но есть фундаментальные различия и ограничения). [Оригинальная строка flussence: у Bash есть регулярные выражения, но они хорошо спрятаны:]

Ниже показано, как удалить все пустое пространство (даже изнутри) из значения переменной.

Вернее, он работает для пробелов в середине переменной, но не тогда, когда я пытаюсь закрепить его в конце. Это помогает любому? Из man-страницы: «$ <параметр / шаблон / строка>[. ] Если шаблон начинается с%, он должен совпадать в конце расширенного значения параметра.» @ Неужели они не регулярные выражения, а что-то похожее? $ удаляет первый пробел $ удаляет все пробелы Нет способа обрезать только начальные и конечные пробелы только с помощью этой конструкции.

Чтобы удалить все пробелы в начале и конце строки (включая символы конца строки):

Это также удалит дубликаты пробелов:

Производит: «в этой строке много пробелов»

В основном xargs удаляет все разделители из строки. По умолчанию он использует пробел в качестве разделителя (это можно изменить с помощью параметра -d). Это, безусловно, самое чистое (как короткое, так и читаемое) решение. Зачем тебе echo -n вообще? echo " my string " | xargs имеет такой же выход.

Удалите один ведущий и один завершающий пробел

Убрать все ведущие и конечные пробелы

Это обрезает только 1 пробел. Таким образом, эхо приводит к 'hello world ', 'foo bar', 'both sides '

Из раздела Bash Guide по глобализации

Использовать extglob в расширении параметра

Вот та же функциональность, заключенная в функцию (ПРИМЕЧАНИЕ: необходимо заключить в кавычки входную строку, переданную функции):

Если мы изменим функцию для выполнения в подоболочке, нам не нужно беспокоиться о проверке текущей опции оболочки для extglob, мы можем просто установить ее, не затрагивая текущую оболочку. Это значительно упрощает функцию. Я также обновляю позиционные параметры «на месте», поэтому мне даже не нужна локальная переменная

как вы заметили, trim () удаляет только начальные и конечные пробелы. Как уже отмечал mkelement, вам нужно передать параметр функции в виде строки в кавычках, т.е. $ (trim "$ string") вместо $ (trim $ string). Я обновил код, чтобы показать правильное использование. Спасибо. Как бы мне не хотелось знать о параметрах оболочки, я не думаю, что конечный результат более элегантен, чем Обратите внимание, что (с достаточно недавней версией Bash?) Вы можете упростить механизм восстановления опции extglob , используя shopt -p : просто напишите local restore="$(shopt -p extglob)" ; shopt -s extglob в начале вашей функции и eval "$restore" в конце (за исключением того, что eval - это зло . ).

Вы можете обрезать просто с помощью echo :

Это объединяет несколько смежных пространств в одно. Вы пробовали это, когда foo содержит подстановочный знак? например, foo=" I * have a wild card" . сюрприз! Более того, это объединяет несколько смежных пространств в одно. Это отличное решение, если вы: 1. не хотите пробелов на концах 2. хотите, чтобы между каждым словом был только один пробел 3. работаете с контролируемым вводом без подстановочных знаков. Это по сути превращает плохо отформатированный список в хороший. Хорошее напоминание о подстановочных знаках @gniourf_gniourf +1. Все еще превосходное решение, Вамп. +1 тебе тоже.

Я всегда делал это с помощью sed

Если есть более элегантное решение, я надеюсь, что кто-нибудь разместит его.

Регулярное выражение соответствует всем конечным пробелам и заменяет его ничем. Это удаляет все конечные пробелы sed -e 's/\s*$//' . Объяснение: «s» означает поиск, «\ s» означает все пробелы, «*» означает ноль или много, «$» означает до конца строки, а «//» означает замену всех совпадений пустой строкой , В 's / * $ //', почему перед звездочкой стоит 2 пробела, а не один пробел? Это опечатка?

Вы можете удалить переводы строк с помощью tr :

Я не хочу удалять '\ n' из середины строки, только из начала или конца.

С включенными расширенными функциями сопоставления с образцом в Bash ( shopt -s extglob ) вы можете использовать это:

удалить произвольное количество ведущих пробелов.

Потрясающе! Я думаю, что это самое легкое и элегантное решение. Смотрите пост @ GuruM ниже для аналогичного, но более общего решения, которое (а) имеет дело со всеми формами пустого пространства и (б) также обрабатывает конечные пробелы. @mkelement +1 за труд переписать мой фрагмент кода как функцию. Спасибо Также работает с OpenBSD по умолчанию / bin / ksh. /bin/sh -o posix тоже работает но я с подозрением Здесь не волшебник Баш; что trimmed ? Это встроенная вещь или переменная, которая обрезается? Удивительно! Просто и эффективно! Понятно мое любимое решение. Спасибо! @CraigMcQueen это значение переменной, так как она read будет хранить в переменной по ее имени $ 1 урезанную версию ее значения $ Параметр функции trim () является именем переменной: см. Вызов функции trim () внутри test_trim (). В рамках trim (), вызываемой из test_trim (), $ 1 расширяется до foo, а $ расширяется до $ foo (то есть до текущего содержимого переменной foo). Поищите в руководстве по bash 'переменная косвенность'. @ AquariusPower нет необходимости использовать echo в подоболочке для однострочной версии, просто read -rd '' str <<<"$str" подойдет.
  • он был успешно протестирован в оболочке bash / dash / busybox
  • это очень мало
  • он не зависит от внешних команд и не нуждается в форке (-> быстрое и низкое использование ресурсов)
  • работает как положено:
    • он удаляет все пробелы и табуляции от начала и до конца, но не более
    • важно: он ничего не удаляет из середины строки (многие другие ответы делают), даже переводы строки останутся
    • special: "$*" объединяет несколько аргументов, используя один пробел. если вы хотите обрезать и вывести только первый аргумент, используйте "$1" вместо
    • если нет проблем с сопоставлением шаблонов имен файлов и т. д.
    Конечно. К сожалению, это не C, и иногда вы хотите избежать вызова внешних инструментов Чтобы сделать код более читабельным и совместимым с копированием, вы можете изменить скобки на экранированные символы: [\ \t] @leondepeon ты пробовал это? Я попробовал, когда написал, и попробовал снова, и ваше предложение не работает ни в одном из bash, dash, busybox

    Вы можете использовать старую школу tr . Например, это возвращает количество измененных файлов в репозитории git, пробелы удалены.

    Это не удаляет пробелы спереди и сзади - оно удаляет все пробелы из строки.

    Это сработало для меня:

    Чтобы поместить это в меньшее количество строк для того же результата:

    Не работал для меня Первый напечатал не обрезанную строку. Второй бросил плохую замену. Можете ли вы объяснить, что здесь происходит? Забавно, это работало в подсказке, но не после переноса в файл сценария bash. странно. Это одна и та же версия Bash в обоих случаях?

    Опираясь на опыт Москита .

    Я видел сценарии, которые просто используют переменные для выполнения работы:

    Пробелы автоматически объединяются и обрезаются. Нужно быть осторожным с метасимволами оболочки (потенциальный риск инъекции).

    Я бы также рекомендовал всегда подставлять переменные в кавычки в условных выражениях оболочки:

    поскольку что-то вроде -o или другого содержимого в переменной может изменить ваши тестовые аргументы.

    Это неупомянуто использование $xyz с , echo что делает пробельную коалесцирующее, не переменная назначению. Чтобы сохранить усеченное значение в переменной в вашем примере, вы должны будете использовать xyz=$(echo -n $xyz) . Кроме того, этот подход подвержен потенциально нежелательному расширению пути (globbing). это просто неправильно, значение в xyz переменной НЕ обрезается. Это не сработает, если между двумя словами больше одного пробела. Попробуйте: echo $(echo "1 2 3") (с двумя пробелами между 1, 2 и 3).

    Я бы просто использовал sed:

    а) Пример использования однострочной строки

    б) Пример использования многострочной строки

    в) Последнее замечание:
    если вам не нравится использовать функцию, для однострочной строки вы можете просто использовать команду «легче запомнить», например:

    Использование вышеперечисленного в многострочных строках также будет работать , но, пожалуйста, обратите внимание, что оно также сократит любой завершающий / ведущий внутренний множественный пробел, как заметил GuruM в комментариях.

    Поэтому, если вы не возражаете, оставьте эти пробелы, пожалуйста, используйте функцию в начале моего ответа!

    d) ОБЪЯСНЕНИЕ синтаксиса sed «найти и заменить» в многострочных строках, используемых внутри функции trim:

    Примечание: как предложено @mkelement, он не будет работать для многострочных строк, хотя он должен работать для однострочных строк. Вы не правы: он работает и на многострочных строках. Просто +1 за использование - мне было легко протестировать код. Однако код по-прежнему не будет работать для многострочных строк. Если вы внимательно посмотрите на вывод, вы заметите, что все начальные / конечные внутренние пробелы также удаляются, например, пространство перед «многострочным» заменяется на «многострочное». Просто попробуйте увеличить количество пробелов в каждой строке. Теперь я понимаю, что вы имеете в виду! Спасибо за голову, я отредактировал мой ответ. @ "Luca Borrione" - добро пожаловать :-) Не могли бы вы объяснить синтаксис sed, который вы используете в trim ()? Это также может помочь любому пользователю вашего кода настроить его для других целей. Также это может даже помочь найти крайние случаи для регулярного выражения.

    Вот функция trim (), которая урезает и нормализует пробел

    И еще один вариант, который использует регулярные выражения.

    Второй подход, основанный на регулярных выражениях, великолепен и не имеет побочных эффектов, но в его нынешнем виде проблематичен: (a) в bash v3.2 + сопоставление по умолчанию НЕ будет работать, поскольку регулярное выражение должно быть в кавычках, чтобы работать и (б) само регулярное выражение не обрабатывает случай, когда входная строка представляет собой один непробельный символ, окруженный пробелами. Чтобы устранить эти проблемы, замените if строку с: if [[ "$trimmed" =

    ' '*([^ ]|[^ ].*[^ ])' '* ]] . Наконец, подход касается только пробелов, а не других форм пробелов (см. Мой следующий комментарий).

    Функция, которая использует регулярные выражения, имеет дело только с пробелами, а не с другими формами пробелов, но ее легко обобщить: замените if строку на: [[ "$trimmed" = Сладкий, который, кажется, работает (ex :) $stripped_version= echo $ var | awk ' 1'`` кроме того, что awk ничего не делает: эхо-переменная без

    Назначения игнорируют начальные и конечные пробелы и как таковые могут быть использованы для обрезки:

    Это не правда. Это «эхо», которое удаляет пробелы, а не назначение. В вашем примере сделайте, echo "$var" чтобы увидеть значение с пробелами. @NicholasSushkin Можно было бы сделать, var=$(echo $var) но я не рекомендую это. Другие решения, представленные здесь, являются предпочтительными.

    Это не имеет проблемы с нежелательным сглаживанием, также, внутреннее пустое пространство не изменяется (при условии, что $IFS установлено значение по умолчанию, которое есть ' \t\n' ).

    Он читает до первой новой строки (и не включает ее) или до конца строки, в зависимости от того, что наступит раньше, и удаляет любое сочетание начальных и конечных пробелов и \t символов. Если вы хотите сохранить несколько строк (а также убрать начальные и конечные новые строки), используйте read -r -d '' var << eof вместо этого; заметьте, однако, что, если ваш ввод будет содержать \neof , он будет отключен непосредственно перед. (Другие формы пробелов, а именно \r , \f и \v , не удаляются, даже если вы добавляете их в $ IFS.)

    Но условный код всегда выполняется, потому что hg st всегда печатает хотя бы один символ новой строки.

    • Есть ли простой способ убрать пробел из $var (например, trim() в PHP )?
    • Есть ли стандартный способ решения этой проблемы?

    Я мог бы использовать sed или AWK , но я хотел бы думать, что есть более элегантное решение этой проблемы.

    Давайте определим переменную, содержащую начальные, конечные и промежуточные пробелы:

    Как удалить все пробелы (обозначается [:space:] в tr ):

    Как удалить только первые пробелы:

    Как удалить только конечные пробелы:

    Как удалить начальные и конечные пробелы - объедините sed s

    Кроме того, если ваш bash поддерживает это, вы можете заменить echo -e "$" | sed . на sed . <<<$ , например, так (для конечного пробела):

    Xargs сделает обрезку за вас. Это одна команда/программа, без параметров, которая возвращает обрезанную строку, просто!

    Примечание: это не удаляет внутренние пробелы, поэтому "foo bar" остается прежним. Это НЕ становится "foobar" .

    Существует решение, которое использует только встроенные модули Bash, называемые подстановочными знаками :

    Вы передаете строку для обрезки в кавычках. например.:

    Приятной особенностью этого решения является то, что оно будет работать с любой POSIX-совместимой оболочкой.

    Ссылка

    В Bash есть функция расширение параметра, которая, помимо прочего, позволяет заменять строки на основе так называемых шаблонов (шаблоны напоминают регулярные выражения, но есть фундаментальные различия и ограничения ). [Оригинальная строка flussence: у Bash есть регулярные выражения, но они хорошо спрятаны:]

    Ниже показано, как удалить все пробелы (даже изнутри) из значения переменной.

    Удалите один ведущий и один пробел

    Strip все начальные и конечные пробелы

    Чтобы удалить все пробелы в начале и конце строки (включая символы конца строки):

    Это также удалит дубликаты пробелов:

    Производит: "в этой строке много пробелов"

    Вы можете обрезать просто с помощью echo :

    Из раздела Bash Guide на globbing

    Использовать extglob в расширении параметра

    Вот та же функциональность, заключенная в функцию (ПРИМЕЧАНИЕ: необходимо заключить в кавычки входную строку, переданную функции):

    Если мы изменим функцию для выполнения в подоболочке, нам не нужно беспокоиться о проверке текущей опции Shell для extglob, мы можем просто установить ее, не затрагивая текущую оболочку. Это значительно упрощает функцию. Я также обновляю позиционные параметры "на месте", поэтому мне даже не нужна локальная переменная

    С включенными расширенными функциями сопоставления с образцом в Bash ( shopt -s extglob ) вы можете использовать это:

    удалить произвольное количество ведущих пробелов.

    Я всегда делал это с помощью sed

    Если есть более элегантное решение, я надеюсь, что кто-нибудь разместит его.

    Вы можете удалить переводы строк с помощью tr :

    • он был успешно протестирован в оболочке bash/dash/busybox
    • это очень мало
    • он не зависит от внешних команд и не нуждается в форке (-> быстрое и низкое использование ресурсов)
    • работает как положено:
      • он удаляет все пробелы и табуляции от начала и до конца, но не более
      • важно: он ничего не удаляет из середины строки (многие другие ответы делают), даже переводы строки останутся
      • special: "$*" объединяет несколько аргументов, используя один пробел. если вы хотите обрезать и вывести только первый аргумент, используйте вместо него "$1"
      • если нет проблем с сопоставлением шаблонов имен файлов и т.д.

      Вы можете использовать old-school tr . Например, это возвращает количество измененных файлов в репозитории git, пробелы удалены.

      Опираясь на опыт Москита .

      Это сработало для меня:

      Чтобы поместить это в меньшее количество строк для того же результата:

      Я видел сценарии, которые просто используют переменные для выполнения работы:

      Пробелы автоматически объединяются и обрезаются. Нужно быть осторожным с метасимволами Shell (потенциальный риск инъекций).

      Я бы также рекомендовал всегда подставлять переменные в кавычки в условных выражениях Shell:

      поскольку что-то вроде -o или другого содержимого в переменной может изменить ваши тестовые аргументы.

      Я бы просто использовал sed:

      а) Пример использования однострочной строки

      б) Пример использования многострочной строки

      с) Последнее замечание:
      Если вам не нравится использовать функцию, для однострочная строка вы можете просто использовать команду "легче запомнить", например:

      Использование вышеупомянутого на многострочные строки также будут работать, но, пожалуйста, обратите внимание, что оно также сократит любой трейлинг/лидирующий внутренний множественный пробел, как заметил GuruM в комментариях

      Так что, если вы не возражаете, оставьте эти пробелы, используйте функцию в начале моего ответа!

      d) ОБЪЯСНЕНИЕ синтаксиса sed "найти и заменить" для многострочных строк, используемых внутри функции trim:

      Назначения игнорируют начальные и конечные пробелы и как таковые могут быть использованы для обрезки:

      Чтобы удалить пробелы и табуляции слева направо в Word, введите:

      Вот функция trim (), которая урезает и нормализует пробел

      И еще один вариант, который использует регулярные выражения.

      Это удалит все пробелы из вашей строки,

      / заменяет первое вхождение, а // все вхождения пробелов в строке. То есть все пробелы заменяются - ничего

      Это самый простой метод, который я видел. Он использует только Bash, это всего несколько строк, регулярное выражение простое и соответствует всем формам пробелов:

      Вот пример скрипта для тестирования:

      Это не имеет проблемы с нежелательным смещением, также внутреннее пустое пространство не изменяется (при условии, что $IFS установлен по умолчанию, то есть ' \t\n' ).

      Он читает до первой новой строки (и не включает ее) или до конца строки, в зависимости от того, что наступит раньше, и удаляет любое сочетание начального и конечного пробелов и символов \t . Если вы хотите сохранить несколько строк (а также убрать начальные и конечные новые строки), используйте вместо этого read -r -d '' var << eof ; заметьте, однако, что если ваш ввод содержит \neof , он будет обрезан как раз перед этим. (Другие формы пробелов, а именно \r , \f и \v , удаляются not, даже если вы добавляете их в $ IFS.)

      В Python есть функция strip() , которая работает аналогично trim() PHP, поэтому мы можем просто сделать небольшую встроенную Python, чтобы сделать легко понятную утилиту для этого:

      Это урезает начальные и конечные пробелы (включая переводы строки).

      trim () удаляет пробелы (и табуляции, непечатаемые символы; для простоты я рассматриваю только пробелы). Моя версия решения:

      Команда "sed" обрезает только начальные и конечные пробелы, но она также может быть передана первой команде, что приводит к:


      Команда tr (translate) используется в Linux в основном для преобразования и удаления символов. Она часто находит применение в скриптах обработки текста. Ее можно использовать для преобразования верхнего регистра в нижний, сжатия повторяющихся символов и удаления символов.

      Команда tr требует два набора символов для преобразований, а также может использоваться с другими командами, использующими каналы (пайпы) Unix для расширенных преобразований.

      В этой статье мы узнаем, как использовать команду tr в операционных системах Linux и рассмотрим некоторые примеры.

      Команда tr и ее синтаксис

      Ниже приведен синтаксис команды tr. Требуется, как минимум, два набора символов и опции.

      SET1 и SET2 это группы символов. are a group of characters. Необходимо перечислить необходимые символы или указать последовательность.

      \NNN -> восмеричные (OCT) символы NNN (1 до 3 цифр)

      \\ -> обратный слеш (экранированный)

      \n -> новая строка (new line)

      \r -> перенос строки (return)

      \t -> табуляция (horizontal tab)

      [:alnum:] -> все буквы и цифры

      [:alpha:] -> все буквы

      [:blank:] -> все пробелы

      [:cntrl:] -> все управляющие символы (control)

      [:digit:] -> все цифры

      [:lower:] -> все буквы в нижнем регистре (строчные)

      [:upper:] -> все буквы в верхнем регистре (заглавные)

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

      Вот некоторые опции:

      -c , -C , --complement -> удалить все символы, кроме тех, что в первом наборе
      -d , --delete -> удалить символы из первого набора
      -s , --squeeze-repeats -> заменять набор символов, которые повторяются, из указанных в последнем наборе знаков

      1) Заменить все строчные буквы на заглавные

      Мы можем использовать tr для преобразования нижнего регистра в верхний или наоборот.

      Просто используем наборы [:lower:] [:upper:] или "a-z" "A-Z" для замены всех символов.

      Вот пример, как преобразовать в Linux с помощью команды tr все строчные буквы в заглавные:

      А сейчас сделаем замену из файла input.txt

      Как мы видим, в файле ничего не изменилось, осталось все строчными буквами. Чтобы изменения были в файле, на необходимо перевести вывод в новый файл. Например, в output.txt


      2) Удаление символов с помощью tr

      Опция -d используется для удаления всех символов, которые указаны в наборе символов.

      Следующая команда удалит все цифры в тексте. Будем использовать набор [:digit:] , чтобы определить все цифры.

      А вот пример команд, которыми можно удалить переносы на новые строки


      3) Удаление ила змена символов НЕ в наборе

      С помощью параметра -c Вы можете сказать tr заменить все символы, которые Вы не указали в наборе. Приведем пример.

      А вот пример удаления, просто укажем опцию -d и только один набор (символы которого удалять НЕ надо, а остальные удалить)


      4) Замена пробелов на табуляцию

      5) Удаление повторений символов

      Это делает параметр -s . Рассмотрим пример удаления повторов знаков.

      Или заменим повторения на символ решетки

      6) Заменить символы из набора на перенос строки

      Сделаем так, чтобы все буквы были заменены на перенос новой строки:


      7) Генерируем список уникальных слов из файла

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

      8) Кодируем символы с помошью ROT

      Давайте проверим, как использовать tr для шифрования.

      В следующем примере каждый символ в первом наборе будет заменен соответствующим символом во втором наборе.

      Первый набор [a-z] (это значит abcdefghijklmnopqrstuvwxyz). Второй набор [n-za-m] (который содержит pqrstuvwxyzabcdefghijklmn).

      Простая команда для демонстрации вышеуказанной теории:

      Полезно при шифровании электронных адресов:

      Вывод

      Если у Вас есть какие-либо дополнения, не стесняйтесь пишите в комментариях.

      Читайте также: