Удалите регулярное выражение для сопоставления шаблонов из группы захвата sed

Вопрос или проблема

Я пытаюсь удалить все вхождения ‘_(один номер)’ из определенных строк в файле. Таким образом, tig00000003_1 должен стать tig00000003. Вот как выглядит мой тестовый файл:

##sequence-region tig00000001_732 1 630
tig00000003_1 Name=tig00000003_1;

Я пробовал
sed -E 's/(tig[0-9]{8}\_[0-9]{1})/ \1(tig[0-9]{8}) /' my_test.txt , что дает:

##sequence-region  tig00000001_7(tig[0-9]{8}) 32 1 630
 tig00000003_1(tig[0-9]{8}) Name=tig00000003_1;

А это то, что я хочу:

##sequence-region tig00000001_732 1 630
tig00000003 Name=tig00000003;

Как я могу удалить совпадающий шаблон в группе захвата или, альтернативно, оставить только совпадение в группе захвата?

Вы можете просто заменить ‘_(один номер)’ на ничего в любых строках, которые не являются комментариями, следующим образом:

sed '/^[^#]/ s/\_[0-9]//g' ваш_файл

Вот как это работает:

  • Строки, не совпадающие с комментариями, определяются как те, которые начинаются с (^) любого символа, кроме # ([^#])
  • Затем на этих строках замените любую нижнее подчеркивание + цифра (_[0-9]) на ничего (//) каждый раз, когда этот шаблон найден в строке (g)

Вы довольно близки. Используйте скобки для захвата вокруг “tig” номера

sed -E '/^#/n; s/(tig[0-9]{8})\_[0-9]/\1/g' my_test.txt
# ...............^^^^^^^^^^^^^........^^

Ответ или решение

Чтобы удалить все вхождения ‘_(одна цифра)’ из строк в файле, вы можете использовать команду sed для обработки текста. В этом случае нам нужно применить регулярные выражения (regex), чтобы найти и удалить нужный шаблон.

Ваша задача заключается в том, чтобы преобразовать строки вида tig00000003_1 в tig00000003. Пример тестового файла, как указано, выглядит следующим образом:

##sequence-region tig00000001_732 1 630
tig00000003_1 Name=tig00000003_1;

Решение с использованием sed

Вот как вы можете сделать это с помощью sed:

sed -E 's/(tig[0-9]{8})_[0-9]+/\1/g' my_test.txt

Объяснение команды

  1. sed -E: Этот флаг включает поддержку расширенных регулярных выражений, что позволяет использовать более сложные шаблоны.

  2. s/: Это команда замены. Она начинает замену, которая следует за символами /.

  3. (tig[0-9]{8}): Это первая группа захвата. Она находит строку, начинающуюся с "tig", за которой следует ровно 8 цифр (от 0 до 9). Содержимое этой группы можно будет использовать в замене.

  4. _[0-9]+: Это часть, которую мы хотим удалить. Она находит символ подчеркивания, за которым следует одна или более цифр.

  5. /\1/g: Это часть замены. Мы заменяем найденное выражение (включающее как первую, так и вторую части) на содержимое первой группы захвата (то есть "tig" плюс 8 цифр). Флаг g указывает на замену всех вхождений в строке.

Применение

Теперь вы можете применить данную команду к вашему файлу, и это приведет к ожидаемому результату:

##sequence-region tig00000001_732 1 630
tig00000003 Name=tig00000003;

Возможные улучшения и уточнения

Если вы хотите обработать только те строки, которые не являются комментариями, вы можете сделать это следующим образом:

sed -E '/^[^#]/ s/(tig[0-9]{8})_[0-9]+/\1/g' my_test.txt

В этом варианте команда сначала отбрасывает строки, которые начинаются с символа #, а затем применяет ту же замену для оставшихся строк. Это позволяет вам избежать изменения строк комментариев.

Заключение

Используя этот подход с sed, вы можете эффективно удалять нежелательные шаблоны из строк в текстовых файлах, соблюдая при этом возможность удаления только в определенных случаях, например, исключая комментарии.

Оцените материал
Добавить комментарий

Капча загружается...