2017-02-07 14 views
1

У меня есть файл «тест» с содержимым:СЭД не работает, как ожидалось, удаление специальный символ из середины строки

sa!ve 
hel!lo 
te!st 
te!ve 
help! 
please! 

Я хотел бы, чтобы удалить восклицательный знак, который между двумя строчными буквами , Таким образом, результаты должны быть:

save 
hello 
test 
teve 
help! 
please! 

Я попытался cat test | sed 's/\([:lower:]\)\!\([:lower:]\)/\1\2/g' и альфа/alphanum, но странно, это работает только для слова «! Не HEL се» и ничего другого, мои результаты были:

sa!ve 
hello 
te!st 
te!ve 
help! 
please! 

Не знаете, почему это не работает для других слов.

+0

Бесполезное использование кошки предупреждение. Рассмотрим 'sed '...' test' – bishop

ответ

4

Проблема: вы неправильно используете класс символов. [:lower:]- это имя набора символов, поэтому вы на самом деле использовали его так [[:lower:]].

Поэтому правильное СЕПГ выражение:

cat test | sed 's/\([[:lower:]]\)\!\([[:lower:]]\)/\1\2/g' 

Который работает, как ожидалось.

Вот результат я получаю:

save 
hello 
test 
teve 
help! 
please! 

Таким образом, вы можете думать о [:lower:], как сокращенная для a-z, поэтому при создании персонажа на лету, это становится [[:lower:]]. Это сложная задача, которую многие люди кусают первые пару раз.

+0

Спасибо, это имеет смысл. Работает так, как ожидалось. Приятно знать, что есть разница, жить и учиться. – TryTryAgain

1

Вы используете символ класса, поэтому [:lower:] будет любой символ в квадратной скобке. На вашем входе, где только l (который присутствует в классе символов :lower:), становится соответствующим, чтобы его заменяли.

Измените его на диапазон символов [a-z] для соответствия любому алфавиту в нижнем регистре в пределах диапазона.

cat test | sed 's/\([a-z]\)\!\([a-z]\)/\1\2/g' 
+2

Или, лучше,' [[: lower:]] ', который сохраняется в локали. –

+0

Хм, работает. Спасибо за руководство, все еще не уверен, почему он не работает. Мне нужно изучить, что использует класс символов или диапазон символов/набор. – TryTryAgain

+2

См. [Спецификация POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03) (RE Bracket Expressions/character classes). –