У меня есть такая строка:
|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/'
awk
решения. Мне нужно учиться awk
.
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
.
Если отбросить несколько постов, перечисленных здесь, кажется, что самый простой способ сделать это:
string="|abcdefg|"
echo ${string:1:-1}
редактировать: работает на Ubuntu с Bash 4.2; не работает на centOS с bash 4.1
Другой способ - использовать head
& tail
команды:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]
с целью сократить скобки, поэтому echo "[something something]" | tail -c +2 | head -c -2
сработало. Спасибо за совет!
echo -n "|abcdefg|" | tail -c +2 | head -c -1
. Я не уверен, почему мои изменения были отклонены ... Это очень грустно, если честно. Более man head
подробная информация
И еще один:
string="|abcdefg|"
echo "${string//|/}"
Вы также можете использовать Sed для удаления | не просто ссылаться на сам символ, а использовать позиционные ссылки, как в:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Где ':' - разделители (вы можете заменить их на / или любой символ, отсутствующий в запросе, любой знак, следующий за символом s, сделает это) Здесь ^ (символ вставки) означает в начале строки ввода, а $ (доллар) означает в конце. . (точка), что это после каретки, а тот, что перед знаком доллара, представляет один символ. Другими словами, мы удаляем первый и последний символы. Имейте в виду, что это удалит любые символы, даже если | его нет в строке.
EX:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Немного более многословный подход, но он работает с любым видом первого и последнего символа, не обязательно должен быть одинаковым. Основная идея заключается в том, что мы берем переменную, читаем ее символ за символом и добавляем только те, которые хотим, к новой переменной
Вот вся эта идея, отформатированная в хорошую функцию
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
$ 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
awk -F\| '{ print $2 }' <<<"|string|"