Это работает для меня:
sed 's/0x[0-9a-f]\{16\}/W64LIT(&)/g'
Это переносит любую последовательность из 16 шестнадцатеричных цифр (только в нижний регистр )с префиксом «0x».
Вам просто нужно творчески подойти к разделителю полей:
$ awk 'BEGIN {FS="_|-"} {print $2}' input
5
Хитрость с FS
в том, что это не строка; это регулярное выражение.
Чтобы объяснить немного более подробно, как вы просите ниже:
Сценарий awk
может определять блок кода с именем BEGIN
, который выполняется до обработки любых входящих данных.
Я использую этот блок кода для определения разделителя полей(FS
)с помощью регулярного выражения в виде дефиса(-
)или подчеркивания(_
).
Следующий блок кода, {print $2}
, будет печатать второе поле (i. е. вторая строка символов, разделенная до сих пор разделителем /-|_/
), который является 5
, который вы ищете. Блок кода без префикса будет выполняться для каждой записи, прочитанной awk
.
sedальтернативный подход:
sed 's/^[^_-]*_\([^_-]*\)-.*/\1/' file
5
Используя <<<
для перенаправления нужной строки в 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
На основеhttps://stackoverflow.com/a/2957781/53897:
echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | perl -n -e '/_([^-]+)/ && print $1'
Можно использовать cut
с первым разделителем _
для получения второго столбца, а затем cut
еще раз с разделителем -
для получения первого столбца.
echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | cut -d"_" -f2 | cut -d"-" -f1