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

Это работает для меня:

sed 's/0x[0-9a-f]\{16\}/W64LIT(&)/g'

Это переносит любую последовательность из 16 шестнадцатеричных цифр (только в нижний регистр )с префиксом «0x».

6
21.11.2018, 00:32
5 ответов

Вам просто нужно творчески подойти к разделителю полей:

$ awk 'BEGIN {FS="_|-"} {print $2}' input
5

Хитрость с FSв том, что это не строка; это регулярное выражение.

Чтобы объяснить немного более подробно, как вы просите ниже:

Сценарий awkможет определять блок кода с именем BEGIN, который выполняется до обработки любых входящих данных.

Я использую этот блок кода для определения разделителя полей(FS)с помощью регулярного выражения в виде дефиса(-)или подчеркивания(_).

Следующий блок кода, {print $2}, будет печатать второе поле (i. е. вторая строка символов, разделенная до сих пор разделителем /-|_/), который является 5, который вы ищете. Блок кода без префикса будет выполняться для каждой записи, прочитанной awk.

8
27.01.2020, 20:23

sedальтернативный подход:

sed 's/^[^_-]*_\([^_-]*\)-.*/\1/' file
5
1
27.01.2020, 20:23

Питон

Используя <<<для перенаправления нужной строки в stdinинтерпретатора Python, а с помощью re.split()мы можем удалить второй элемент в результирующем списке элементов, разделенных на два разделителя.

$ python -c 'import re,sys; print(re.split("-|_",sys.stdin.readline())[1])'  <<< "MQSeriesRuntime_5-U200491-7.5.0-4.x86_64"                          
5 

В качестве альтернативы мы могли бы просто передать строку в качестве аргумента строки команды -и работать сsys.argv[1]:

$ python3 -c 'import re,sys; print(re.split("-|_",sys.argv[1])[1])' "MQSeriesRuntime_5-U200491-7.5.0-4.x86_64"                                       
5

Это работает с Python 2 и 3. Если мы хотим обработать файл и извлечь входные данные из каждой строки таким образом, мы можем сделать следующее:

$ cat input.txt
MQSeriesRuntime_5-U200491-7.5.0-4.x86_64
MQSeriesRuntime_2-U200491-7.5.0-4.x86_64
MQSeriesRuntime_6-U200491-7.5.0-4.x86_64
$ python3 -c 'import re,sys; print("\n".join(map(lambda x: re.split("-|_",x)[1], sys.stdin.readlines())))'  < input.txt                              
5
2
6
0
27.01.2020, 20:23

На основеhttps://stackoverflow.com/a/2957781/53897:

echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | perl -n -e '/_([^-]+)/ && print $1'
0
27.01.2020, 20:23

Можно использовать cutс первым разделителем _для получения второго столбца, а затем cutеще раз с разделителем -для получения первого столбца.

echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | cut -d"_" -f2 | cut -d"-" -f1 
0
27.01.2020, 20:23

Теги

Похожие вопросы