У меня есть строка, которая всегда 3 символа ... первый и последний всегда одинаковы.
пример:
▁▅█
Есть ли простой способ показать только один в середине? (который единственный, который меняется)
У меня есть строка, которая всегда 3 символа ... первый и последний всегда одинаковы.
пример:
▁▅█
Есть ли простой способ показать только один в середине? (который единственный, который меняется)
Да, попробуйте сделать это и выберите предпочитаемый метод =):
С grep:
echo "ixi" | grep -oP "^.\K."
С вырезом:
echo "ixi" | cut -c2
С расширением параметра bash :
x='ixi'; echo ${x:1:1}
С помощью sed:
echo "ixi" | sed 's/.\(.\)./\1/'
или же
echo "ixi" | sed 's/\(^.\|.$\)//g'
С perl:
echo "ixi" | perl -lne 'print $& if /^.\K./'
С рубином:
echo "ixi" | ruby -ne 'print $_.split(//)[1]'
С awk:
echo 'ixi' | awk '{split($0, a, ""); print a[2]}'
С питоном:
echo "ixi" | python -c 'print list("'$(cat)'")[1]'
или же
python -c 'import sys; print list(sys.argv[1])[1]' ixi
\K
перезапустить матч до нуля (см. pcre
)$(cat)
в python - это хак для получения STDIN
Вы также можете использовать sed
вместо grep
:
sed 's/.\(.\)./\1/'
Это говорит:
s/
... сопоставить выражение с точностью до следующего символа /
..
... соответствует первому символу (любому).\(.\)
... сопоставить следующий символ и запомнить его..
... соответствует третьему символу (любому)./
... обозначает конец выражения.\1
... заменить всю строку, которая соответствует символу, который был запомнен./
... конец текста замены.Таким образом:
$ echo "abc" | sed 's/.\(.\)./\1/'
Распечатает:
b
Для разнообразия вот один способ с dd
:
echo ixi | dd bs=1 skip=1 count=1 2>/dev/null
Если ваш grep не поддерживает Perl (-P
), вы можете сделать это так:
echo ixi | grep -o . | sed -n 2p
Эти альтернативы работают только для однострочного ввода.
︙
или же
echo "ixi" | awk '{print substr($0,2,1)}'
или же
expr "ixi" : '.\(.\).'