2013-03-19 2 views
9

Я пробовал почти все (думаю), но ничего не получилось. (Операционная система: Ubuntu 12,04)Регулярный символ в Sed

Выражения должны быть согласованы (удалены из текстовых файлов):

a c 4 
a k 23 
o s 1 

Что я пробовал:

's/[[a-z][:space:][a-z][:space:][0-9]]\{1,\}//gi' 
's/.\s.\s[0-9]+//g' 
's/[:alpha:][:space:][:alpha:][:space:][:digit:]+' 

ответ

13

Это должно соответствовать:

sed 's/[a-z][ ]*[a-z][ ]*[0-9]*//gi' 

Ваша первая попытка пропускает пару квадратных скобок, и вам не нужны внешние пе:

sed 's/[a-z][[:space:]][a-z][[:space:]][0-9]\{1,\}//gi' input 

Ваш второй пример терпит неудачу, потому что вам нужно, чтобы избежать +, и до сих пор он будет работать только в гну SED:

sed 's/.\s.\s[0-9]\+//g' input 

Также некоторые аналогичные проблемы с последней:

sed 's/[[:alpha:]][[:space:]][[:alpha:]][[:space:]][[:digit:]]\+//' input 
1

Первый этаж: ! Вы должны избегать знака «плюс» по той причине, что находится за пределами меня. Я также заменил точку «.» на «[a-z]», чтобы она соответствовала буквам.

sed 's/[a-z]\s[a-z]\s[0-9]\+//g' 

Bonus портативная версия для старых sed -Versions (Привет, пользователи Mac!). Некоторые sed реализации придирчивы на «+»:

sed 's/[a-z]\s[a-z]\s[0-9][0-9]*//g' 
1

[...] определяет класс символов. [a-z] соответствует любому персонажу от a до z. Чтобы соответствовать последовательным символам, вы должны использовать класс для каждого: [a-z][[:space:]][a-z].

Для +, чтобы иметь особое значение, вы должны обратная косая черта: [0-9]\+.

Именованные классы символов работают только внутри классов символов, то есть [[:alpha:]][[:space:]].

Смежные вопросы