Как прервать последние 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