Bash: разбить текстовый файл на слова с не алфавитно-цифровыми символами в качестве разделителей - PullRequest
8 голосов
/ 25 сентября 2010

Допустим, « textfile » содержит следующее:

lorem$ipsum-is9simply the.dummy text%of-printing

и что вы хотите напечатать каждое слово в отдельной строке. Однако , слова должны быть определены не только пробелами, но и всеми не алфавитно-цифровыми символами.Таким образом, результаты должны выглядеть следующим образом:

 lorem
 ipsum  
 is9simply  
 the  
 dummy  
 text  
 of  
 printing

Как мне добиться этого с помощью оболочки Bash?



Некоторые примечания:

  • Это не домашний вопрос.

  • Более простой случай, когда слова должны определяться только пробелами,это просто.Просто напишите :

    for i in `cat textfile`; do echo $i; done;
    

    , и все получится, и вернитесь:

     lorem$ipsum-is9simply
     the.dummy
     text%of-printing
    

    Для разделения слов по буквенно-цифровым символам IЯ видел решения, которые используют переменную среды IFS (ссылки ниже), но я бы хотел избежать использования IFS по двум причинам: 1) потребовалось бы (я думаю) установить в IFS длинный список не алфавитно-цифровых символов.2) Я нахожу это немного уродливым.

  • Вот два связанных вопроса и ответов, которые я нашел
    Как разбить строкуразделитель в Bash?
    Как разбить строку на слова, разделенные одним или несколькими пробелами в bash?

Ответы [ 2 ]

18 голосов
/ 25 сентября 2010

Используйте команду tr :

tr -cs 'a-zA-Z0-9' '\n' <textfile

-c - для дополнения указанных символов;«-s» выжимает дубликаты замен;'a-zA-Z0-9' - это набор буквенно-цифровых символов (возможно, также добавьте _?);\ n - символ замены (перевод строки).Вы также можете использовать класс символов, который чувствителен к локали (и может содержать больше символов, чем приведенный выше список):

tr -cs '[:alnum:]' '\n' <textfile
3 голосов
/ 25 сентября 2010
$ awk -f splitter.awk < textfile

$ cat splitter.awk
{
  count0 = split($0, asplit, "[^a-zA-Z0-9]")
  for(i = 1; i <= count0; ++i) { print asplit[i] }
}
...