Как я могу извлечь текст между парой одного и того же символа?
Входные данные:
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]" foobar1
split()
разделит строку на список полей, разделенныхŤ
и мы напечатали второй элемент из списка.