У меня есть такая строка:
|abcdefg|
И я хочу получить новую строку, вызванную каким-либо образом (например, string2) с исходной строкой без двух |
символы в начале и в конце его, так что у меня будет это:
abcdefg
Возможно ли это в bash?
У меня есть такая строка:
|abcdefg|
И я хочу получить новую строку, вызванную каким-либо образом (например, string2) с исходной строкой без двух |
символы в начале и в конце его, так что у меня будет это:
abcdefg
Возможно ли это в bash?
Вы можете сделать
string="|abcdefg|"string2=${string#"|"}string2=${string2%"|"}echo $string2
Или, если длина вашей строки постоянна, вы можете сделать
string="|abcdefg|"string2=${string:1:7}echo $string2
Кроме того, это должно сработать
echo "|abcdefg|" | cut -d "|" -f 2
Также это
echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
Вот решение, которое не зависит от длины строки (bash):
string="|abcdefg|"echo "${string:1:${#string}-2}"
Исходя из нескольких сообщений, перечисленных здесь, кажется, что самый простой способ сделать это -:
string="|abcdefg|"echo ${string:1:-1}
редактировать: работает на ubuntu с bash 4.2; не работает на CentOS с bash 4.1
Другой способ - использовать head
& tail
команды:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2abcdefg
Вы также можете использовать sed для удаления |, не просто ссылаясь на сам символ, но используя позиционные ссылки, как в:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'abcdefg
Где ':' - это разделители (вы можете заменить их на / или любым символом, которого нет в запросе, это сделает любой знак, следующий за s) Здесь ^ (каретка) означает в начале входной строки, а $ (доллар) означает в конце. Точка . (точка), которая находится после каретки, и точка, которая находится перед знаком доллара, представляют собой один символ. Другими словами, мы удаляем первый и последний символы.Имейте в виду, что это приведет к удалению любых символов, даже если | его нет в строке.
от:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'bcdef
И еще один:
string="|abcdefg|"echo "${string//|/}"
Немного более подробный подход, но работает с любым типом первого и последнего символа, не обязательно должен быть одинаковым. Основная идея заключается в том, что мы берем переменную, читаем ее символ за символом и добавляем в новую переменную только те, которые нам нужны
Вот вся эта идея, отформатированная в приятную функцию
crop_string_ends() { STR="$1" NEWSTR="" COUNT=0 while read -n 1 CHAR do COUNT=$(($COUNT+1)) if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ] then continue fi NEWSTR="$NEWSTR"$CHAR done <<<"$STR" echo $NEWSTR }
И вот та же самая функция в действии:
$> crop_string_ends "|abcdefg|" abcdefg$> crop_string_ends "HelloWorld" elloWorl
>>> mystring="|abcdefg|">>> print(mystring[1:-1])abcdefg
или в командной строке:
$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|" abcdefg
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}' abcdefg
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|" abcdefg
Компактное и универсальное решение:
expr "|abcdef|" : '.\(.*\).'
Специальный в данном случае и допускающий, что символ '|' может быть там или нет:
expr "|abcdef" : '|*\([^|]*\)|*'
$ string="|abcdefg|"$ string="${string#?}" && string="${string%%?}"$ echo "$string"abcdefg
От http://tldp.org/LDP/abs/html/parameter-substitution.html
${var#Pattern}
Удалить из$var
то самый короткий часть$Pattern
это соответствует внешний интерфейс от$var
.
${var%%Pattern}
Удалить из$var
то самый длинный часть$Pattern
это соответствует задний конец от$var
.
Вы можете использовать это:
echo "|abcdefg|" | tr -d "|"
С помощью этой строки кода вы удаляете все |>- (труба) в струне.