Ввод:
blahŤfoobar1Ťblah
Требуемый вывод:
foobar1
Я хочу получить текст между двумя символами «Ť».
Предположим, что всегда будет 0 или 2 символа «Ť», чтобы было легче.
Я попробовал следующее, но я не знаю, как узнать, что это за случай:
echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'
Можно использовать команду сокращения.
Для извлечения второго шаблона:
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
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
Ť
Используя sed
echo "blahŤfoobar1Ťblah" | sed -r 's/(^.*Ť)(.*)(Ť.*$)/\2/'
производит
foobar1
, Другой возможный способ использовать sed
echo "blahŤfoobar1Ťblah" | sed -r 's/.*Ť(.*)Ť.*/\1/'
произвел
foobar1
спасибо за @kos для -r
примечание
Можно также использовать 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
печать только подобранная часть
(?<=Ť)
нулевая ширина положительный взгляд позади шаблона, гарантирующего, что будет a Ť
до соответствия
(?=Ť)
нулевая ширина положительный предварительный шаблон, гарантирующий, что существует a Ť
после соответствия
[^Ť]+
будет соответствовать одному или нескольким символам между двумя Ť
персонажи.
Используя python
:
$ python2 -c "print 'blahŤfoobar1Ťblah'.split('Ť')[1]"
foobar1
split()
разделит строку на список полей, разделенных Ť
и мы распечатали второй элемент из списка.