#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 с базовым регулярным выражением.)