Как я могу извлечь текст между парой одного и того же символа?
Входные данные:
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
С помощью
bash:$ test='blahŤfoobar1Ťblah' $ spamegg="${test#*Ť}" $ echo "${spamegg%Ť*}" foobar1Здесь мы использовали
bashПараметр раскрытия получит искомую подстроку."${test#*Ť}"удалит частьblahŤтак что переменнаяspameggбуду иметьfoobar1Ťblah${spamegg%Ť*}уберет трейлингŤblahтак что мы бы получили выходfoobar1
С помощью
grep:$ echo "blahŤfoobar1Ťblah" | grep -Po '(?<=Ť)[^Ť]+(?=Ť)' foobar1-Pреализуетperlсовместимый Regex,-oпечатает только соответствующую часть(?<=Ť)является положительным взглядом нулевой ширины за шаблоном, обеспечивающимŤдо матча(?=Ť)является положительным прогнозным шаблоном нулевой ширины, обеспечивающим наличиеŤпосле матча[^Ť]+будет соответствовать один или несколько символов между двумяŤперсонажи.
С помощью
python:$ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]" foobar1split()разделит строку на список полей, разделенныхŤи мы напечатали второй элемент из списка.