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

Входные данные:

blahŤfoobar1Ťblah

Желаемый вывод:

foobar1

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

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

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

echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'

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'}

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

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

С помощью sed

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

выход

foobar1

Еще один возможный способ использования sed

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

выход

foobar1

Спасибо за @kos за -r нота

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
Ť

Вы также можете использовать perl чтобы извлечь текст:

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

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

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

$ echo "blahŤfoobar1Ťblah" | perl -pe 's/.*Ť(.*)Ť.*/$1/' 
foobar1
  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 печатает только соответствующую часть

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

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

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

  3. С помощью python:

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