Sed удалить весь текст после и включая третье подчеркивание - PullRequest
0 голосов
/ 19 сентября 2018

Мне нужно отредактировать следующую строку

UA399_GTTTCG_L002_R1_001.file.gz

до

UA399_GTTTCG_L002

Я попробовал sed 's/^\(.*\)_.*/\1/', но он производит

UA399_GTTTCG_L002_R1

Может кто-нибудь помочь, пожалуйста?

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Это может сработать для вас (GNU sed):

sed 's/_[^_]*//3g' file

Удалите третий (или более) набор (-ы) символов, начинающихся с подчеркивания, за которыми следует ноль или более не подчеркиваний.

0 голосов
/ 19 сентября 2018

Вы можете просто использовать cut для этой задачи:

cut -d'_' -f1-3 <<<STRING

С вашим примером:

kent$  cut -d'_' -f1-3 <<<"UA399_GTTTCG_L002_R1_001.file.gz"
UA399_GTTTCG_L002 
0 голосов
/ 19 сентября 2018

С GNU sed:

sed -E 's/((_*[^_]*){3}).*/\1/' file
0 голосов
/ 19 сентября 2018

Вы можете использовать sed или awk или cut, например:

s='UA399_GTTTCG_L002_R1_001.file.gz'
awk -F'_' '{print $1"_"$2"_"$3}' <<< "$s"
sed 's/^\([^_]*\(_[^_]*\)\{2\}\).*/\1/' <<< "$s"
cut -d_ -f1,2,3 <<< "$s"

См. онлайн-демонстрацию .В обоих случаях результат будет UA399_GTTTCG_L002.

sed Подробнее

  • ^ - начало строки
  • \([^_]*\(_[^_]*\)\{2\}\) - соответствие группы захвата 1:
    • [^_]* - 0+ символов, отличных от _
    • \(_[^_]*\)\{2\} - два последовательных вхождения (\{2\}) из:
      • _ - знак подчеркивания
      • [^_]* - 0+ символов, отличных от _
  • .* - остаток строки.

Замена - это просто заполнитель, содержащий текст группы 1.

awk details

  • -F'_' разбивает запись на разделенные подчеркиванием поля
  • print $1"_"$2"_"$3 печатает только первое, второе и третье поля и объединяет их с _ char.

cut подробности

  • -d_ устанавливает разделитель поля на _ символ
  • -f1,2,3 выбирает только указанный набор полей (он также может принимать диапазон полей, как в Kрешение энта ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...