Удалить строку с sed в шаблоне с цифрами

#string #sed

#строка #сэд

Вопрос:

У меня есть столбец типа string (константа, всегда abc), за которым следуют числа в диапазоне от 1 до 35, как показано ниже:

 abc1 
abc15 
abc20 
abc25 
abc30 
abc35
 

Я попытался удалить это, чтобы удалить часть abc

 sed -i 's/abc[0:9]/[0:9]/g' <inputfile> 
 

И это далеко не работает .. есть предложения?

Ответ №1:

Используя awk

 awk -F'abc' '{print $2}' file
awk '{sub(/abc/,"")}1' file
 

Используя sed

 sed 's/abc//g' file
 

Если вам нужно убедиться, что он имеет правильный номер после abc

 sed 's/abc([1-3][05]*)/1/' file
 

Комментарии:

1. Отлично работает с образцом ввода, но если образец ввода представляет только один столбец во входном файле с несколькими столбцами, все становится сложнее. В любом случае, команда g in sed должна быть удалена. [1-3][05]* на самом деле соответствует не 1-35, а 1-3, 10-15, 20-25, 30-35, а также 100-155, 200-255, …

2.@mklement0 я не был уверен, как использовать ? в sed регулярных выражениях. Я знаю, что вы можете это сделать gnu sed , но вы ошибаетесь в первой части, она не соответствует 10-15 , почему: [1-3] соответствует 1 2 и 3 . [05] соответствует 0 или 5 , не так, как вы думаете 0 5 , это было бы [0-5]

3. Повторно совместимая с POSIX замена для ? в базовых регулярных выражениях: вы можете использовать {0,1} (в качестве исключения: аналогично, может быть заменен на {1,} ). Спасибо, что уловили мое неправильное толкование [05] . Однако я хотел сказать, что ваше регулярное выражение не соответствует числам с 1 по 35, как того требует OP во вступительном предложении ( "numbers ranging from 1 to 35" ), хотя ваше регулярное выражение охватывает данные выборки .

4. @mklement0 Спасибо за ? помощь, но sed 's/abc([1-3][05]{0,1})/1/' будет верно для abc235 и возврата 235 . Что касается числа, я действительно прочитал это ranging from 1 to 35, as follow так, чтобы это можно было понять по-разному. Я действительно воспринял это буквально. 🙂

5. Re 1 — 35: достаточно справедливо 🙂 Проблема sed 's/abc([1-3][05]{0,1})/1/' <<<'abc235' заключается не в использовании {0,1} — что действительно работает, — а в том, что вы не сопоставляете остальную часть строки и, следовательно, не удаляете оставшиеся цифры путем замены; попробуйте sed 's/abc([1-3][05]{0,1}).*/1/' <<<'abc205' . (В качестве отступления: поскольку базовые регулярные выражения не поддерживают alternation ( | ), я бы даже не знал, как по-настоящему сопоставить числа с 1 по 35 с базовым регулярным выражением.)