У меня есть команда, которая выводит мне список со следующей схемой
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
...
Как я могу получить числа после «_T» и «_s» соответственно, используя sed
или что-то подобное в bash?
Выходные данные должны выглядеть следующим образом
8
8
8
10
10
10
и
1
5
10
1
5
10
для _T
и _s
соответственно
Первая часть моя команда выглядит так:
for f in $(find . -name "someFile.txt" | sort); do echo $f; done | grep /someFolderName/
В основном я хотел бы добавить команду к приведенной выше.
Используя sed
с шаблоном, группирующимся для получения желаемые части:
your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)$/\1 \2/'
([0-9]+)
первая полученная группа, [0-9]
соответствия любое число между 0-9
и +
указывает на один или несколько соответствие предыдущего маркера [0-9]
в этом случае
([0-9]+)
вторая полученная группа
В заменяющем шаблоне двумя полученными группами ссылаются \1
и \2
соответственно.
Пример:
$ cat file.txt
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
$ sed -r 's/.*_T([0-9]+)_s([0-9]+)/\1 \2/' file.txt
8 1
8 5
8 10
10 1
10 5
10 10
Измените заменяющий шаблон для удовлетворения потребностей, например, без любого пространства:
your_command | sed -r 's/.*_T([0-9]+)_s([0-9]+)/\1\2/' file.txt
Ответьте на отредактированный вопрос:
Для _T
:
your_command | grep -Po '.*_T\K\d+' ## Using grep
your_command | sed -r 's/.*_T([0-9]+).*/\1/' ## Using sed
Для _s
:
your_command | grep -Po '.*_s\K\d+$' ## Using grep
your_command | sed -r 's/.*_s([0-9]+)$/\1/' # Using sed
Используя AWK:
command | awk -F_T\|_s '{print $2}'
command |
awk -F_T\|_s '
{
print $2
}
'
и:
command | awk -F_T\|_s '{print $3}'
command |
awk -F_T\|_s '
{
print $3
}
'
, Где command
команда, это производит файл.
-F_T\|_s
: наборы _T
и _s
как разделители поля ввода; {print $2}
: печатает 2-е поле. {print $N}
: печатает 3-е поле. % cat file
exp_70_T8_s1
exp_71_T8_s5
exp_72_T8_s10
exp_73_T10_s1
exp_74_T10_s5
exp_75_T10_s10
% cat file | awk -F_T\|_s '{print $2}'
8
8
8
10
10
10
% cat file | awk -F_T\|_s '{print $3}'
1
5
10
1
5
10
ls -ld
твердо помнить, существуют альтернативы, например,file /mnt
(какой файл является/mnt),stat
& больше... – guiverc 14 August 2017 в 14:53