Обрезать строку с помощью sed

У меня есть команда, которая выводит мне список со следующей схемой

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/ 

В основном я хотел бы добавить команду к приведенной выше.

1
задан 5 April 2016 в 17:45

2 ответа

Используя 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
6
ответ дан 6 April 2016 в 03:45
  • 1
    я соглашаюсь с @Mox' s ответ, но имеют эти мысли. Если каталог,/mnt, существовал, но you' d не смонтированный что-либо в него (принятие Вас имело доступ для записи к нему), файл будет скопирован в тот каталог. если Вы позже ' смонтируйте устройство/mnt' файлы в/mnt каталоге являются ' hidden' и содержание устройства показывают. umount для видения/получения доступ скрытых файлов. Если эти ls -ld твердо помнить, существуют альтернативы, например, file /mnt (какой файл является/mnt), stat & больше... – guiverc 14 August 2017 в 14:53

Используя 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
5
ответ дан 6 April 2016 в 03:45
  • 1
    Вы правы. Содержание второго файла находится в/mnt, но первый потерян..Спасибо! – bapors 14 August 2017 в 14:53

Другие вопросы по тегам:

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