2012-03-06 2 views
3

Мой ввод текста в этом форматеPattern Matching в Shell

aa5b r1  12715 
r2  12221 
aa43b ew  13721 
eb  122331 
aa4b ff  1055440 

Выход должен быть

aa5 r1  12715 
r2 12221 
aa43 ew  13721 
eb 122331 
aa4 ff  1055440 

Я попытался с

awk -F " " '{print $1}' t1 | grep "^aa*" > t2|sed s/b//g t2 

Проблема с этим кодом является то, что вход текст не имеет фиксированного шаблона.

+0

Вы хотите заблокировать первый b или последний символ, если первое поле или первый символ после числа или что-то еще? Ваши примеры слишком похожи, чтобы сделать вывод о том, как обобщать. Можете ли вы описать, что хотите, со словами? (В некотором смысле все это «фиксированные шаблоны», и все же вы говорите, что их нет?) – tripleee

ответ

1

Что об этой версии с sed?

sed 's/^\(aa[0-9]*\)b/\1/' t1 > t2 
+0

GNU sed версия 4.1.5 – Debaditya

+0

@Debaditya: Извините - я не понимаю ваш комментарий. Я попробовал свое решение с GNU sed 4.2.1, 4.1.5 и старой версией в Solaris 8. Для меня это работало во всех случаях. – bmk

1

Было бы проще использовать что-то вроде Perl и регулярных выражений:

perl -p -e 's/^(aa[0-9]+)\w+/$1/' t1 > t2 
+0

perl -p -e's /(.*?) B/$ 1/'t1> t2 также можно использовать , Это работает хорошо. Я хочу его в оболочке. – Debaditya

+0

@Debaditya Что означает «Я хочу это в оболочке»? Каким образом использование awk и grep удовлетворяет вашим требованиям, что perl не делает? –

+0

@William Использование команды unix. Perl можно использовать, но было бы лучше, если бы я получил результат с помощью команд unix (sed, awk, grep, find ...) – Debaditya

0
awk ' $1 ~ /a/ { $1= substr($1,0,length($1)-1) };1' infile > outfile 
1

данные спецификации не ясно из вашего описания проблемы, но если вы просто хотите, чтобы удалить все вхождения символа «B» на линии, которые начинаются «аа», вы можете использовать:

 
sed '/^aa/s/b//g'