попробуйте это
TEMP=$(mktemp) # create unique tempfile
while read line; do # read one line from inputfile
# do what you want, e.g
echo "($line)" >> $TEMP # only an example
done < inputfile # use inputfile in while-loop
cat $TEMP
rm $TEMP # remove tempfile
На имя "Ṣalāḥ ad-Dīn Yūsuf ibn Ayyūb" (см. http://en.wikipedia.org/wiki/Saladdin), который является именем, и который является последним? Что относительно на имя "(изобретен) Roberto Garcia y Vega"? "Chiang Kai-shek" (см. http://en.wikipedia.org/wiki/Chang_Kai-shek)?
Пробелы на имена являются наименьшим количеством Ваших проблем! Посмотрите Имена в глобальном приложении: Что сохранить.
^\p{L}+(\s+\p{L}+)*$
Этот regex имеет следующие функции:
\w
или a [^ ]
будет),Но что относительно фамилий как "O'Connor" или написанных через дефис фамилий... хм...
? спецификатор является Вашим другом. Делает самое короткое возможное соответствие вместо жадного. Используйте его для имени, как в:
^(.+?) (.+)$
Группа 1 захватывает все до первого пространства, группа 2 получает остальных.
Конечно, теперь что Вы делаете, если имя содержит пробелы?
Это должно сделать задание:
^[a-zA-Z][a-zA-Z ]*[a-zA-Z]$
Править: Вот небольшое улучшение, которое позволяет последние за одно имена и дефисы/апострофы на имя:
^[a-zA-Z'][a-zA-Z'- ]*[a-zA-Z']?$
Я думаю, что это больше, что Вы искали:
^[^ ][a-zA-Z ]+[^ ]$
Это должно соответствовать началу строки без пространства, альфа-символов или пространства и никакого пространства в конце.
Это работает в irb, но в прошлый раз я работал с C#, я использовал подобный regexes:
(нуль хорош, нулевые отказавшие средства),
>> "Di Giorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/
=> 0
>> "DiGiorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/
=> 0
>> " DiGiorno" =~ /^[^ ][a-zA-Z ]+[^ ]$/
=> nil
>> "DiGiorno " =~ /^[^ ][a-zA-Z ]+[^ ]$/
=> nil
>> "Di Gior no" =~ /^[^ ][a-zA-Z ]+[^ ]$/
=> 0