Как я могу извлечь текст между парой одного и того же символа?

Ввод:

blahŤfoobar1Ťblah

Требуемый вывод:

foobar1

Я хочу получить текст между двумя символами «Ť».

Предположим, что всегда будет 0 или 2 символа «Ť», чтобы было легче.

Я попробовал следующее, но я не знаю, как узнать, что это за случай:

echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'
2
задан 20 May 2015 в 08:17

6 ответов

Можно использовать команду сокращения.

Для извлечения второго шаблона:

echo "blah@foobar1@blah" | cut -f2 -d"@"

Для извлечения вторых и третьих шаблонов:

echo "blah@foobar1@blah" | cut -f2,3 -d"@"

Для извлечения из второго шаблона вперед

echo "blah@foobar1@blah" | cut -f2- -d"@"

РЕДАКТИРОВАНИЕ: Так как вопрос был отмечен с awk. Вот awk решение.

echo "blah@foobar1@blah" | awk -F'@' {'print $2'}
0
ответ дан 20 May 2015 в 08:17

awk, кажется, является самым легким использовать для этой проблемы:

$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print $2 }'
foobar1
0
ответ дан 20 May 2015 в 08:17

awk любит эти вещи:

$ awk -F"Ť" '{print $2}' <<< "blahŤfoobar1Ťblah"
foobar1

При помощи Ť как разделитель полей, мы удостоверяемся, что ловим требуемый текст во втором блоке. Если мы хотели бы пропустить обработку, если никакой Ť найден в данной строке, мы могли бы использовать awk -F"Ť" 'NF>1{print $2}'.

<час>

Относительно Вашей попытки, не работающей: путем высказывания sed -n '/start/,/end/p' Ваш печатают те строки, которые являются между (и включены) строка, содержащая start и другой содержащий end. Таким образом, это работало бы, если бы Вы хотели это.

Пример

, Учитывая этот файл:

$ cat a
starting...
Ť
foobar1
hello
Ť
i am here

вывод:

$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť
0
ответ дан 20 May 2015 в 08:17

Используя sed

echo "blahŤfoobar1Ťblah" | sed  -r 's/(^.*Ť)(.*)(Ť.*$)/\2/'

производит

foobar1

, Другой возможный способ использовать sed

echo "blahŤfoobar1Ťblah" | sed -r 's/.*Ť(.*)Ť.*/\1/' 

произвел

foobar1

спасибо за @kos для -r примечание

0
ответ дан 20 May 2015 в 08:17

Можно также использовать perl извлечь текст:

$ echo 'blahŤfoobar1Ťblah' | perl -FŤ -ane 'print"$F[1]\n"'
foobar1

Здесь ключ должен использовать -F опция установить разделитель.

Другой подход с помощью регулярного выражения:

$ echo "blahŤfoobar1Ťblah" | perl -pe 's/.*Ť(.*)Ť.*/$1/' 
foobar1
1
ответ дан 20 May 2015 в 08:17
  1. Используя bash :

    $ test='blahŤfoobar1Ťblah'
    $ spamegg="${test#*Ť}"
    $ echo "${spamegg%Ť*}"
    foobar1
    

    Здесь мы использовали bash расширение параметра получает желаемую подстроку.

    • "${test#*Ť}" удалит часть blahŤ , так переменная spamegg будет иметь foobar1Ťblah

    • ${spamegg%Ť*} удалит запаздывание Ťblah, таким образом, мы получили бы вывод foobar1

  2. Используя grep :

        $ echo "blahŤfoobar1Ťblah" | grep -Po '(?<=Ť)[^Ť]+(?=Ť)'
        foobar1
    
    • -P реализации perl совместимый Regex, -o печать только подобранная часть

    • (?<=Ť) нулевая ширина положительный взгляд позади шаблона, гарантирующего, что будет a Ť до соответствия

    • (?=Ť) нулевая ширина положительный предварительный шаблон, гарантирующий, что существует a Ť после соответствия

    • [^Ť]+ будет соответствовать одному или нескольким символам между двумя Ť персонажи.

  3. Используя python :

    $ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]"
    foobar1
    
    • split() разделит строку на список полей, разделенных Ť и мы распечатали второй элемент из списка.
1
ответ дан 20 May 2015 в 08:17

Другие вопросы по тегам:

Похожие вопросы: