Как прервать последние n байтов строки в bash string choping?
например qa_sharutils-2009-04-22-15-20-39
, хотите перерезать последние 20 байтов и получить 'qa_sharutils
'.
Я знаю, как это сделать в sed, но почему $A=${A/.\{20\}$/}
не работает?
Спасибо!
Ответы
Ответ 1
Если ваша строка хранится в переменной с именем $str, это даст вам подстроку без последних 20 цифр в bash
${str:0:${#str} - 20}
в основном, нарезка строк может быть выполнена с помощью
${[variableName]:[startIndex]:[length]}
и длина строки
${#[variableName]}
EDIT:
решение с использованием sed, которое работает с файлами:
sed 's/.\{20\}$//' < inputFile
Ответ 2
с помощью awk:
echo $str | awk '{print substr($0,1,length($0)-20)}'
или используя манипуляции с строками - echo ${string: position: length}:
echo ${str:0:$((${#str}-20))}
Ответ 3
В синтаксисе ${parameter/pattern/string}
в bash шаблон - шаблон шаблона в шаблоне пути, а не регулярное выражение. В подстановочных синтаксисе точки .
только буквальная точка и фигурные скобки используются для сопоставления выбора опций (например, трубы |
в регулярных выражениях), так что линия будет просто стереть символьную строку ".20"
.
Ответ 4
Существует несколько способов выполнения основной задачи.
$ str="qa_sharutils-2009-04-22-15-20-39"
Если вы хотите удалить последние 20 символов. Этот выбор подстроки основан на нулевом значении:
$ echo ${str::${#str}-20}
qa_sharutils
"%" и "%%" для разметки с правой стороны строки. Например, если вы хотите basename, минус все, что следует за первым "-":
$ echo ${str%%-*}
qa_sharutils
Ответ 5
похож на substr ('abcdefg', 2-1, 3) в php:
echo 'abcdefg'|tail -c +2|head -c 3
Ответ 6
только если ваши последние 20 байтов всегда являются датой.
$ str="qa_sharutils-2009-04-22-15-20-39"
$ IFS="-"
$ set -- $str
$ echo $1
qa_sharutils
$ unset IFS
или когда первая тире и дальше не нужны.
$ echo ${str%%-*}
qa_sharutils