У меня есть строка, которая всегда 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" : '.\(.\).'