sed не заменяет

POSIXly и в локали C/POSIX вы должны быть в состоянии полагаться на ps -o etime, предоставляя вам прошедшее время в формате, подобном [dd-]hh:mm:ss. Таким образом, процессы, работающие не менее 6 часов, будут теми, в которых не -нулевая часть dd-или когда часть hhбольше 06, поэтому:

LC_ALL=C ps -Ao etime,pid |
  LC_ALL=C awk '$1 ~ /[1-9].*-|([1-9].|0[6-9]):..:/ {print $2}'

Будет сообщать идентификаторы процессов, запущенных более 6 часов.

Обратите внимание, что процесс может (и часто )выполняет более одной команды за время своего существования.

3
22.11.2020, 15:57
3 ответа

Ваш шаблон пытается сопоставить \в начале строки, которого у вас нет:

$ echo '>chr05_pilon_pilon.12.t1' | sed '/^\\>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.t1

Без попытки сопоставить \в начале строки:

$ echo '>chr05_pilon_pilon.12.t1' | sed '/^>chr[0-9][0-9]_pilon_pilon/ s/\(.*\)t/\1/'
>chr05_pilon_pilon.12.1

Возможно, вы также захотите разрешить X-, Y- и, возможно, М-хромосомы (в зависимости от того, что содержит сборка вашего генома):

echo '>chr05_pilon_pilon.12.t1' | sed -E '/^>chr([0-9][0-9]|[XYM])_pilon_pilon/ s/(.*)t/\1/'

Также обратите внимание, что /gне требуется.

6
18.03.2021, 22:47

Всякий раз, когда вы работаете с регулярными выражениями, вы должны помнить, что «меньше значит больше». Я имею в виду, что вы всегда должны пытаться использовать шаблон самый простой и самый короткий , который соответствует вашим данным. Не пытайтесь сопоставить все, выбирайте только ту часть, которая вам действительно нужна.

В этом случае у вас есть >chr05_pilon_pilon.12.t1, и все, что вам нужно сделать, это удалить последний tпосле последнего .. Так что не пытайтесь сопоставлять с самого начала, вас это не волнует, и это только усложнит ваше регулярное выражение и сделает его более неправильным, как вы это сделали. Вот несколько альтернатив,в зависимости от того, что вам действительно нужно:

  1. Удалить все не -числовые символы после последнего .в строках, начинающихся с >:

    .
     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)\.[^0-9]*/\1./'
     >chr05_pilon_pilon.12.1
    
  2. Удалить последние tв строках, начинающихся с >:

    .
     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*)t/\1/'
     >chr05_pilon_pilon.12.1
    
  3. То же, что и выше, но только если tнаходится сразу после.

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>.*\.)t/\1/'
     >chr05_pilon_pilon.12.1
    
  4. Удалить последнее t, которое следует за ., но только в строках, начинающихся с >, затем chr, за которыми следуют ровно два числа иpilon_pilon:

     $ echo '>chr05_pilon_pilon.12.t1' | sed -E 's/^(>chr[0-9][0-9]_pilon_pilon.*\.)t/\1/'
     >chr05_pilon_pilon.12.1
    
  5. Наконец, предполагая, что у вас также могут быть хромосомы X, Yи Mили MT, вы можете расширить описанное выше, чтобы оно соответствовало и им

    .
     $ printf '>chrX_pilon_pilon.12.t1\n>chr05_pilon_pilon.12.t1\n>chrMT_pilon_pilon.12.t1\n' |
          sed -E 's/^(>chr([0-9XYM]{1,2}|MT)_pilon_pilon.*\.)t/\1/'
     >chrX_pilon_pilon.12.1
     >chr05_pilon_pilon.12.1
     >chrMT_pilon_pilon.12.1
    
6
18.03.2021, 22:47

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

#!/bin/bash
echo '>chr05_pilon_pilon.12.t1' | sed 's/.t/./'

Выход:

 >chr05_pilon_pilon.12.1
-1
18.03.2021, 22:47

Теги

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