4

У меня есть строка, которая всегда 3 символа ... первый и последний всегда одинаковы.

пример:

▁▅█

Есть ли простой способ показать только один в середине? (который единственный, который меняется)

4 ответа4

9

Да, попробуйте сделать это и выберите предпочитаемый метод =):

С :

echo "ixi" | grep -oP "^.\K."

С :

echo "ixi" | cut -c2

С расширением параметра :

x='ixi'; echo ${x:1:1}

С помощью :

echo "ixi" | sed 's/.\(.\)./\1/'

или же

echo "ixi" | sed 's/\(^.\|.$\)//g'

С :

echo "ixi" | perl -lne 'print $& if /^.\K./'

С :

echo "ixi" | ruby -ne 'print $_.split(//)[1]'

С :

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
5

Вы также можете использовать sed вместо grep:

sed 's/.\(.\)./\1/'

Это говорит:

  1. s/ ... сопоставить выражение с точностью до следующего символа / .
  2. . ... соответствует первому символу (любому).
  3. \(.\) ... сопоставить следующий символ и запомнить его.
  4. . ... соответствует третьему символу (любому).
  5. / ... обозначает конец выражения.
  6. \1 ... заменить всю строку, которая соответствует символу, который был запомнен.
  7. / ... конец текста замены.

Таким образом:

$ echo "abc" | sed 's/.\(.\)./\1/'

Распечатает:

b
1

Для разнообразия вот один способ с dd:

echo ixi | dd bs=1 skip=1 count=1 2>/dev/null

Если ваш grep не поддерживает Perl (-P), вы можете сделать это так:

echo ixi | grep -o . | sed -n 2p

Эти альтернативы работают только для однострочного ввода.

1

        ︙
или же

echo "ixi" | awk '{print substr($0,2,1)}'

или же

expr "ixi" : '.\(.\).'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .