Как обрезать строку bash
Перейти к содержимому

Как обрезать строку bash

  • автор:

[bash] обрезать строку вывода

Как можно взять например первые три или последние три символа вывода команды?

trill
31.05.09 01:20:02 MSD

cobold ★★★★★
( 31.05.09 01:30:33 MSD )

$ echo 123456789 | cut -c1-3 123 $ echo 123456789 | rev | cut -c1-3 | rev 789

gorilych ★★
( 31.05.09 12:21:26 MSD )

и head/tail и cut/rev не будут работать нормально с utf

gorilych ★★
( 31.05.09 12:23:55 MSD )
Ответ на: комментарий от gorilych 31.05.09 12:23:55 MSD
sdio ★★★★★
( 31.05.09 12:28:18 MSD )
Ответ на: комментарий от gorilych 31.05.09 12:23:55 MSD

Или даже grep $ echo "превед" | grep -Eo '^.' пре $ echo "превед" | grep -Eo '.$' вед

sdio ★★★★★
( 31.05.09 12:30:27 MSD )
Ответ на: комментарий от gorilych 31.05.09 12:23:55 MSD

Проблема умножить число символов на два(для utf8)?

gotf
( 31.05.09 17:43:45 MSD )
Ответ на: комментарий от gotf 31.05.09 17:43:45 MSD

$ echo превед | cut -c1-2 п $ echo превед | cut -c1-3 п $ echo превед | cut -c1-4 пр $ echo превед | cut -c1-11 преве $ echo превед | cut -c1-12 превед

gotf
( 31.05.09 17:45:48 MSD )
Ответ на: комментарий от gotf 31.05.09 17:43:45 MSD

на два говоришь?

$ echo 123превед | cut -c1-5 123п

gorilych ★★
( 31.05.09 17:55:36 MSD )
Ответ на: комментарий от gorilych 31.05.09 17:55:36 MSD

Про представление циферок-то я и забыл.

gotf
( 31.05.09 18:18:02 MSD )
Ответ на: комментарий от gotf 31.05.09 18:18:02 MSD

$ echo abcпревед | cut -c1-5 -> abcп

(Если брать кириллицу и латиницу), кириллица 2 байта, остальное один 🙂

f3ex ★★
( 01.06.09 10:02:13 MSD )
Ответ на: комментарий от f3ex 01.06.09 10:02:13 MSD

Ладно, ладно, торможу. Ну не бывает у меня выхлопа команд, содержащего кириллицу :-). Кроме того, я привык именно к grep/sed, и проблему такую не должен был заметить anyway.

Форум русскоязычного сообщества Ubuntu

Страница сгенерирована за 0.042 секунд. Запросов: 26.

  • Сайт
  • Об Ubuntu
  • Скачать Ubuntu
  • Семейство Ubuntu
  • Новости
  • Форум
  • Помощь
  • Правила
  • Документация
  • Пользовательская документация
  • Официальная документация
  • Семейство Ubuntu
  • Материалы для загрузки
  • Совместимость с оборудованием
  • RSS лента
  • Сообщество
  • Наши проекты
  • Местные сообщества
  • Перевод Ubuntu
  • Тестирование
  • RSS лента

© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.

Как обрезать строку bash

Bash поддерживает на удивление большое количество операций над строками. К сожалению, этот раздел Bash испытывает недостаток унификации. Одни операции являются подмножеством операций подстановки параметров, а другие — совпадают с функциональностью команды UNIX — expr. Это приводит к противоречиям в синтаксисе команд и перекрытию функциональных возможностей, не говоря уже о возникающей путанице.

Длина строки $ expr length $string expr «$string» : ‘.*’

stringZ=abcABC123ABCabc echo $ # 15 echo `expr length $stringZ` # 15 echo `expr "$stringZ" : '.*'` # 15

Пример 9-10. Вставка пустых строк между параграфами в текстовом файле

#!/bin/bash # paragraph-space.sh # Вставка пустых строк между параграфами в текстовом файле. # Порядок использования: $0 if [ "$len" -lt "$MINLEN" ] then echo # Добавление пустой строки после последней строки параграфа. fi done exit 0
stringZ=abcABC123ABCabc # |------| echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8

Index expr index $string $substring Номер позиции первого совпадения в $string c первым символом в $substring.

stringZ=abcABC123ABCabc echo `expr index "$stringZ" C12` # 6 # позиция символа C. echo `expr index "$stringZ" 1c` # 3 # символ 'c' (в #3 позиции) совпал раньше, чем '1'.

Эта функция довольно близка к функции strchr() в языке C.

stringZ=abcABC123ABCabc # 0123456789. # Индексация начинается с 0. echo $ # abcABC123ABCabc echo $ # bcABC123ABCabc echo $ # 23ABCabc echo $ # 23A # Извлекает 3 символа. # Возможна ли индексация с "правой" стороны строки? echo $ # abcABC123ABCabc # По-умолчанию выводится полная строка. # Однако . . . echo $ # Cabc echo $ # Cabc # Теперь выводится правильно. # Круглые скобки или дополнительный пробел "экранируют" параметр позиции. # Спасибо Dan Jacobson, за разъяснения.

Если $string — » * » или » @ » , то извлекается до $length позиционных параметров (аргументов), начиная с $position.

echo $ # Вывод 2-го и последующих аргументов. echo $ # То же самое. echo $ # Вывод 3-х аргументов, начиная со 2-го.

expr substr $string $position $length Извлекает $length символов из $string, начиная с позиции $position.

stringZ=abcABC123ABCabc # 123456789. # Индексация начинается с 1. echo `expr substr $stringZ 1 2` # ab echo `expr substr $stringZ 4 3` # ABC
stringZ=abcABC123ABCabc # ======= echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1 echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1 echo `expr "$stringZ" : '\(. \)'` # abcABC1 # Все вышеприведенные операции дают один и тот же результат.

expr match «$string» ‘.*\($substring\)’ Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение. Поиск начинается с конца $string. expr «$string» : ‘.*\($substring\)’ Находит и извлекает первое совпадение $substring в $string, где $substring — это регулярное выражение. Поиск начинается с конца $string.

stringZ=abcABC123ABCabc # ====== echo `expr match "$stringZ" '.*\([A-C][A-C][A-C][a-c]*\)'` # ABCabc echo `expr "$stringZ" : '.*\(. \)'` # ABCabc

Удаление части строки $ Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки $ Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с начала строки

stringZ=abcABC123ABCabc # |----| # |----------| echo $ # 123ABCabc # Удаление самой короткой подстроки. echo $ # abc # Удаление самой длинной подстроки.

$ Удаление самой короткой, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки $ Удаление самой длинной, из найденных, подстроки $substring в строке $string. Поиск ведется с конца строки

stringZ=abcABC123ABCabc # || # |------------| echo $ # abcABC123ABCa # Удаляется самое короткое совпадение. Поиск ведется с конца $stringZ. echo $ # a # Удаляется самое длинное совпадение. Поиск ведется с конца $stringZ.

Пример 9-11. Преобразование графических файлов из одного формата в другой, с изменением имени файла

#!/bin/bash # cvt.sh: # Преобразование всех файлов в заданном каталоге, #+ из графического формата MacPaint, в формат "pbm". # Используется утилита "macptopbm", входящая в состав пакета "netpbm", #+ который сопровождается Brian Henderson (bryanh@giraffe-data.com). # Netpbm -- стандартный пакет для большинства дистрибутивов Linux. OPERATION=macptopbm SUFFIX=pbm # Новое расширение файла. if [ -n "$1" ] then directory=$1 # Если каталог задан в командной строке при вызове сценария else directory=$PWD # Иначе просматривается текущий каталог. fi # Все файлы в каталоге, имеющие расширение ".mac", считаются файлами #+ формата MacPaint. for file in $directory/* # Подстановка имен файлов. do filename=$ # Удалить расширение ".mac" из имени файла #+ ( с шаблоном '.*c' совпадают все подстроки #+ начинающиеся с '.' и заканчивающиеся 'c', $OPERATION $file > "$filename.$SUFFIX" # Преобразование с перенаправлением в файл с новым именем rm -f $file # Удаление оригинального файла после преобразования. echo "$filename.$SUFFIX" # Вывод на stdout. done exit 0 # Упражнение: # -------- # Сейчас этот сценарий конвертирует *все* файлы в каталоге # Измените его так, чтобы он конвертировал *только* те файлы, #+ которые имеют расширение ".mac".

Замена подстроки $ Замещает первое вхождение $substring строкой $replacement. $ Замещает все вхождения $substring строкой $replacement.

stringZ=abcABC123ABCabc echo $ # xyzABC123ABCabc # Замена первой подстроки 'abc' строкой 'xyz'. echo $ # xyzABC123ABCxyz # Замена всех подстрок 'abc' строкой 'xyz'.

$ Подстановка строки $replacement вместо $substring. Поиск ведется с начала строки $string. $ Подстановка строки $replacement вместо $substring. Поиск ведется с конца строки $string.

stringZ=abcABC123ABCabc echo $ # XYZABC123ABCabc # Поиск ведется с начала строки echo $ # abcABC123ABCXYZ # Поиск ведется с конца строки

9.2.1. Использование awk при работе со строками

В качестве альтернативы, Bash-скрипты могут использовать средства awk при работе со строками.
Пример 9-12. Альтернативный способ извлечения подстрок

#!/bin/bash # substring-extraction.sh String=23skidoo1 # 012345678 Bash # 123456789 awk # Обратите внимание на различия в индексации: # Bash начинает индексацию с '0'. # Awk начинает индексацию с '1'. echo $ # с 3 позиции (0-1-2), 4 символа # skid # В эквивалент в awk: substr(string,pos,length). echo | awk ' < print substr("'"$"'",3,4) # skid > ' # Передача пустого "echo" по каналу в awk, означает фиктивный ввод, #+ делая, тем самым, ненужным предоставление имени файла. exit 0

9.2.2. Дальнейшее обсуждение

  1. Пример 12-6
  2. Пример 9-15
  3. Пример 9-16
  4. Пример 9-17
  5. Пример 9-19

Как извлечь часть строки в Bash

Необходимо из строки вырезать подстроку определённой длины. Это можно сделать в терминале. Можно указать позицию начального символа в строке и её длину.

Самый простой способ — это использовать команду cut:

echo "abcdefg" | cut -c3-5

С опцией -c команда cut указываются номер первого и последнего символа включительно для вырезаемой подстроки.

Если вы используете Bash (обычно так и есть), то в нём предусмотрены другие способы как вырезать подстроку из строки.

Обратите внимание, что ПАРАМЕТР — это НЕ строка из которой вы хотите извлечь подстроку, это имя переменной!

Рассмотрим следующий пример:

a=abcdefghij echo $

fghij

То есть переменной a присвоено значение abcdefghij и из того значения во второй строке вырезается подстрока, которая начинается с пятого символа и заканчивается последним символом.

Если указать ДЛИНУ, то можно вырезать строку определённой длины, начинающейся с определённого символа:

a=abcdefghij echo $

cdef

Если нужно заменить подстроку на строку используйте:

name=file_0456.mp4 echo $
song0456.mp4

Если нужно удалить статичную строку:

Пример с удалением префикса:

name=file_0456.mp4 echo $

0456.mp4

Пример с удалением суффикса:

name=file_0456.mp4 echo $

file_0456

Связанные статьи:

  • Как в Bash проверить, содержит ли строка подстроку (62.3%)
  • Как переменной присвоить значение в несколько строк в скрипте Bash (62.3%)
  • Как объединить вывод двух и более команд (59.7%)
  • Как записать символы строки в обратном порядке (59.3%)
  • Как ввести в cin строки с пробелами в С++ (59.3%)
  • Как присвоить переменной вывод команды в Bash (RANDOM — 3%)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *