2012-03-29 3 views
1

У меня есть большой текстовый файл в формате.Соответствие 2 регулярным выражениям по определенным критериям?

english word: spanish equivalent words here; 
english word: spanish equivalent words here; 
for about 1000 lines 

Что мне нужно сделать, это найти слова о том, что английское слово такое же, как испанское слово за исключением того, последняя буква «е» было изменено на «O» Таким образом, все английские слова, end в 'e', ​​их испанское эквивалентное слово - это то же самое правописание, за исключением последней буквы, это «o», а не «e». Я надеюсь, что имело смысл:

Например я составить слово

thiswordE: spanishwordO; would be returned whilst 
thisword: spanishwordO; would not 
thisword: spanishword; would also not be returned 

Я попытался выделить это с:

awk '/[^e:]*e:/ && /[^o;]*o;/ {print}' a.txt 

и

awk '/.*(e:|o;)/ {print}' a.txt 

Ни один из них не работал для меня .. может кто-нибудь помочь мне? Или назовите меня в правильном направлении?

Также говорят, что я использовал awk для поиска определенного выражения, как бы установить переменную, равную этому регулярному выражению?

Например, если бы я имел регулярное выражение для указанного выше файла

awk '/...:/' (so the last 3 letters before the :) 

и хотел установить переменную равен результат этого регулярного выражения, как бы я это сделать?

Если вы дадите мне прямой ответ, можете ли вы объяснить, как это работает, пожалуйста?

+0

С вопросами о домашнем задании обязательно укажите ограничения на инструменты или методы (awk _or_ sed или _any_ UNIX filter?), Которые должны использоваться или могут использоваться и как ожидается выход (в этом случае вам нужен текстовый файл с результатами? или вам нужна программа, которая может просто распечатать их на экране? Модифицировать файл на месте или сделать копию и помещать ее в другое место?) –

ответ

2

Я думаю, что что-то подобное должно работать (если не то, что я не знаю, что особенного AWK):

([a-zA-Z]+)[eE]:\s*\1[oO];.* 

Это позволяет во всех случаях (без переключателя), так что просто удалите заглавные буквы, где это вам не нужны они или где вы не хотите их разрешать. Последние .* допускают что-либо после запятой и перед новой строкой. \1 является обратной ссылкой на то, что было подобрано выражением первого, содержащимся в скобках, и \s любой пробельный (включая переводы строк)

Просто спросить, если вы хотите больше объяснений.

Редактировать: это общее регулярное выражение и не совместимо с awk, так как awk не поддерживает обратные ссылки - см. follow-up question by the OP для уточнения его использования в sed, а не awk.

+0

Ссылка на 1/1 - это именно то, что я был находясь в поиске! Спасибо, новый должен был быть чем-то вроде этого – Max

+0

Привет, «Code Jockey», не уверен, что вы собираетесь это сделать ... но я не могу заставить ваш код работать. Я получаю ошибку «Недопустимая обратная ссылка», я пытаюсь реализовать код внутри sed, так как awk не поддерживает обратную связь очень хорошо. – Max

+0

@Max Okie doke - Я не являюсь awk/sed гуру любыми способами (я, кажется, помню, как они использовали их хотя бы один раз в прошлом ...?), И я _think_ вам нужны обратные ссылки, чтобы сделать это, но вы можете помочь, по крайней мере, добавить тег [tag: sed] к вашему вопросу (у вас есть место для еще одного) и, возможно, переписать или добавить к вашему вопросу некоторые из вещей, которые вы пробовали. Я всегда собираюсь учиться, поэтому я собираюсь потратить некоторое время на поиск ответа, но если бы я был вами, я бы попытался понять это и обновить ваш вопрос своими выводами, чтобы показать исследовательские усилия. Кто-то еще может помочь. –

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