Оболочка Linux извлекает подстроку между подходящими шаблонами - PullRequest
0 голосов
/ 06 февраля 2019

Допустим, у меня есть строка poskek|gfgfd|XLSE|a1768|d234|uijjk, и я хочу извлечь только часть LSE.

Я только знаю, что будет |X непосредственно перед LSE и | сразу после части, которая меня интересует LSE.

Ответы [ 5 ]

0 голосов
/ 06 февраля 2019

В качестве чистого решения bash попробуйте:

str='poskek|gfgfd|XLSE|a1768|d234|uijjk'
ext=${str#*|X}
ext=${ext%%|*}
echo "$ext"

Если доступно регулярное выражение, также работает следующее:

if [[ $str =~ .*\|X([^|]+) ]]; then
    echo "${BASH_REMATCH[1]}"
fi
0 голосов
/ 06 февраля 2019

Для этого конкретного случая вы можете сделать довольно нетрадиционно:

awk '$1=="X"{$1="";print}' FS= OFS= RS=\|
0 голосов
/ 06 февраля 2019

попробуйте

 echo 'poskek|gfgfd|XLSE|a1768|d234|uijjk' | 
   awk -F "|" '{for(i=1;i<=NF;++i) printf "%s", (substr($i,1,1)=="X"?substr($i,2):"")}'

, где

-F - разделитель полей => '|'NF - количество полей

0 голосов
/ 06 февраля 2019

Другой ответ, использующий sed, должен работать, но я всегда нахожу sed немного неуклюжим для выбора регулярных выражений, поскольку он действительно предназначен для замены (следовательно, почему любая сторона шаблона должна быть окружена .* а та часть, которую вы на самом деле хотите, должна быть в скобках).Вот решение, использующее grep:

grep -Po '\|X\K[^|]+'

-P сигналов grep для использования механизма регулярных выражений Perl, который является более продвинутым

-o только для печатисоответствующая часть строки

\|X совпадает с буквенной вертикальной чертой и заглавной буквой X

\K забыть, что было найдено в данный момент (не включайте его в окончательный вывод)

[^|]+ один или несколько символов, кроме вертикальных черт

0 голосов
/ 06 февраля 2019
echo 'poskek|gfgfd|XLSE|a1768|d234|uijjk' | sed -n 's/.*|X\([^|]\+\).*/\1/p'

Это должно сработать.

Объяснено:

sed -n не напечатает ничего, если не указано

s/ - найти и заменить
.*|X - сопоставить все, вплоть до |X
\([^|]\+\) - захватить несколько (хотя бы одного) символа, который не является |
.* - сопоставить с остальнымитекст (просто чтобы «съесть его»)
/\1/p - заменить весь сопоставленный текст первым захватом и вывести

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...