Intereting Posts
Почему установка сервера Ubuntu 14.04.1 LTS дает мне 14.04.3 Как можно отключить DYLD_LIBRARY_PATH для запуска процессов? Расширение обмена на Centos Являются ли символические ссылки синхронными с родительским файлом все время? Как изменить размер шрифта экрана при использовании виртуальной консоли? Удалять заголовки и содержимое из плоского файла, если они находятся ниже определенного количества строк Как назвать объем в Linux, чтобы я мог распознавать каждый том в файловой системе? Почему пространство имен ACPI продолжает меняться ZFS в Linux отправляет / получает резюме о плохой / плохой связи ssh Как скомпилировать исходный код в ядре? Как включить IOMMU в ядре debian sid Midnight Commander – редактор в шестнадцатеричном режиме Как использовать одну и ту же библиотеку более одного раза в службе имен службы (NSS) CentOS – действует ненормально каждую неделю и приводит к отключению всей моей настройки, как я могу откат / восстановление до одной недели? Как отложить постфиксное начало на raspbian?

Как удалить все числа, окруженные <>

Я пробовал это

sed -i '' 's/[0-9]*<>/g' 

Но это не сработало.

Пример файла:

 <Number1> </Number8> 

вывод:

 <Number> </Number> 

Следующие работы:

 sed -i 's/\(<[^0-9>]*\)[0-9]*\([^0-9]*>\)/\1\2/g' filename 

На самом деле это очень легко сделать с sed . Вы просто получаете столько, сколько сможете за один раз, потом снова:

 sed -e :t -e 's/\(<[^<]*\)[0-9]\{1,\}\([^>]*>\)/\1\2/g;tt' 

Я попробовал это со следующими случайными битами ввода:

 <Number1> 234234 </Nu994845mb6er8>' 234234 <000000000000000000000000000000000000>> <a1> 2 <34b5c> 6 7 def 

И результаты были:

 <Number> 234234 </Number> 234234 <>> <a> 2 <bc> 6 7 def 

Регулярное выражение просто совпадает по меньшей мере с одним числом между символами < и a > . Он продолжает заменять эту последовательность чисел ничем, пока она не сможет более успешно это сделать. Это цель команды t est.

Иначе вы можете сделать это без цикла:

 sed 's/^/>/;s/\(>[^<>]*\)*[0-9]*/\1/g;s/.//' <<\INPUT <Number1> 234234 </Nu994845mb6er8>' 234234 <000000000000000000000000000000000000>> <a1> 2 <34b5c> 6 7 def INPUT 

ВЫВОД

 <Number> 234234 </Number>' 234234 <>> <a> 2 <bc> 6 7 def 

Он всегда будет пропускать все > до тех пор, пока не встретится с < -, поэтому он влияет только на группы <[^<>]*> . Смотрите, если вас интересует, почему.

Вам понадобится цикл вокруг команды подстановки (возможно как в sed, так и в perl) или вложенной команде подстановки (только для perl). Я предпочитаю последний подход; это немного более общее:

 perl -pe 's/\<([^>]*)\>/do{$a = $1; $a =~ s,\d,,g; "\<" . $a . "\>"}/ge;' 

Пример ввода:

 <a1> 2 <34b5c> 6 7 def 

Вывод:

 <a> 2 <bc> 6 7 def 

Объяснение: Опция -p говорит, что мы хотим прочитать файл строки за строкой, выполнить скрипт для каждой строки и напечатать результат (например, в sed); -e означает, что следующий аргумент – это скрипт, который должен быть выполнен.

По сути, скрипт – это просто команда подстановки: мы ищем < , за которым следует любое количество не-символов, а затем > . Модификатор e после трейлинга / указывает на специальную функцию команды подстановки: ее запасная часть не является строкой, которая должна быть напечатана, но снова последовательность команд, которая должна быть выполнена. В этой командной последовательности мы сначала присваиваем строку между < и > (т. Е. $1 ) новой переменной $a , затем выполняем другую команду подстановки на $a которая просто заменяет каждую цифру ( \d ) ничем и, наконец, возвращает < , а затем измененная строка, а затем > . Модификатор g (как после трейдинга / и для трейлинга) означает, что команды подстановки должны выполняться для каждой строки соответствия, а не только для первой.

Если открытие < и соответствующее > может быть в разных строках, скажем,

 <abc1 opt="def"> 

добавьте параметр -0777 (т. е. perl -0777 -pe '...' ), так что perl считывает весь файл перед его обработкой вместо работы по очереди ( режим slurp ).

короткая седельная дорога

 sed 's/<\([^>]\+\)[0-9]\+>/<\1>/g' file