У меня есть строку вроде этого:
|abcdefg|
И я хочу, чтобы получить новую строку, называется каким-либо образом (например, строка2) с исходную строку без символов двух |
в начале и в конце его, так что я буду иметь это:
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/'
Здесь'ы решение, которое не зависит от длины строки (Баш):
string="|abcdefg|"
echo "${string:1:${#string}-2}"
Уходит несколько должностей, перечисленных здесь, кажется, самый простой способ сделать это:
string="|abcdefg|"
echo ${string:1:-1}
редактировать: работает на Ubuntu с bash 4.2; не работает на CentOS с bash 4.1
Другим способом является использование голова
& хвост
команды:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
И еще один:
string="|abcdefg|"
echo "${string//|/}"
Вы также можете использовать sed для удаления | не просто ссылка на сам символ, но, используя позиционные ссылки, как в:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Где ':' являются разделители (их можно заменить / или любой символ не в запросе, любой знак после будут это делать) здесь ^ (крышка) означает в начале входной строки и $ (доллар) означает в конце. Интернет . (точке), что он's после каре, и один, что он's перед тем, как знак доллара представляет один символ. Итак, другими словами, мы удаляем первые и последние символы. Возьмите в виду, что это будет удалить любые символы, даже если | он's не присутствует в строке.
Экс:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
функция ### раковина Немного более трудоемкий подход, но работает на любой вид первого и последнего символа, не'т должны быть одинаковыми. Основная идея заключается в том, что мы принимаем переменную, читать его посимвольно, и добавления только тех мы хотим новую переменную
Здесь's, что вся идея отформатировать в хорошие функции
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" : '|*\([^|]*\)|*'
$ строка=" и|abcdefg|с" $ строка=" и${строка#?}&и" && строка=" и${строка%%?}&и" Эхо "$;$строка"и abcdefg
От http://tldp.org/LDP/abs/html/parameter-substitution.html
${ВАР#шаблон}
удалить из переменной$VARна *короткие* часть
$шаблон, что соответствует *передок* из переменной$var
.${ВАР%%шаблон}
удалить из переменной$VARв *длинный* часть
$шаблон, что соответствует *конец* из переменной$var
.
Вы можете использовать это:
echo "|abcdefg|" | tr -d "|"
С этой строки кода, Вы удалите все |->(трубы) в строке.