Вопрос или проблема
Я пытаюсь удалить все вхождения ‘_(один номер)’ из определенных строк в файле. Таким образом, 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
Объяснение команды
-
sed -E: Этот флаг включает поддержку расширенных регулярных выражений, что позволяет использовать более сложные шаблоны.
-
s/: Это команда замены. Она начинает замену, которая следует за символами
/
. -
(tig[0-9]{8}): Это первая группа захвата. Она находит строку, начинающуюся с "tig", за которой следует ровно 8 цифр (от 0 до 9). Содержимое этой группы можно будет использовать в замене.
-
_[0-9]+: Это часть, которую мы хотим удалить. Она находит символ подчеркивания, за которым следует одна или более цифр.
-
/\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
, вы можете эффективно удалять нежелательные шаблоны из строк в текстовых файлах, соблюдая при этом возможность удаления только в определенных случаях, например, исключая комментарии.