#regex #bash #scripting #matching
#регулярное выражение #bash #написание #сопоставление
Вопрос:
учитывая имя файла в качестве аргумента, скрипт считывает имя файла и создает новый файл, содержащий только строки, состоящие из одного слова.
Примером ввода и вывода будет
Там в классе 20 учеников. [ТАБУЛЯЦИЯ] [ПРОБЕЛ] Почти половина из них зачислена в FOS. Остальные находятся в Преподаватели.
Вывод из скрипта должен выглядеть следующим образом
Там [ТАБУЛЯЦИЯ] [ПРОБЕЛ] Почти Преподаватели.
Здравствуйте, я начинающий программист, и я пытаюсь изучить bash scripting уже более месяца, но подобные вопросы все еще ставят меня в тупик. Пожалуйста, обрисуйте общий подход.Спасибо
Комментарии:
1. Каково ваше определение «слова»?
2. Как вы определяете bash-скриптинг? Можете ли вы вызывать скрипты на Perl или Python? Awk? Sed?
Ответ №1:
grep -P "^[s]*[0-9A-Za-z-] .?[s]*$" test.txt
Где test.txt
содержится входной текст.
Здесь я определяю слово как имеющее ноль или более пробелов в начале и конце. Затем любая комбинация алфавитов, цифр и -
и , необязательно заканчивающаяся точкой.
ПРИМЕЧАНИЕ :: Это не сработает, если вы рассматриваете числа с плавающей запятой как слово. Следовательно, ваше определение a word
определяет результат и регулярное выражение.
Комментарии:
1. попробовал .. это работает, спасибо всем. Нет, я не думаю, что мы рассматриваем числа с плавающей запятой как word.
2. Если у вас нет
grep -P
, попробуйте гораздо более простойegrep -i '[-a-z0-9][^-a-z0-9] [-a-z0-9]' test.txt
Ответ №2:
вероятно, самый простой способ: awk 'NF==1' filename
Ответ №3:
Код: cat $1 | egrep "^s*w s*$" > output.txt
.
Объяснения:
- Вы можете ссылаться на переменные, которые использует ваша программа,
$1..$9
поэтому, если вы запустите свою программу,$ > myprogram filename.txt
тогда$1
будетfilename.txt
2. Вы можете прочитать содержимое файла с помощью cat filename
. Вы можете перенести содержимое файлов в следующую строку кода, используя |
(символ канала).
-
Вы можете использовать
egrep
программу для отображения только строк, в которых совпадает регулярное выражение. -
регулярное выражение для получения строк только из одного слова может быть:
^s*w s*$
. которое гласит: в начале строки может быть ноль или более пробелов (s — пробелы, * равно нулю или более, ^ — начало строки). затем один или несколько символов ( w — буквы, цифры и подчеркивание, — один или несколько). затем ноль или более пробелов, а затем должен быть конец строки. это означает, что это регулярное выражение не будет отображать строку ‘something something’, потому что оно ожидает конец строки после пробела, а не больше слов. -
Вы можете перенаправить вывод egrep в файл, используя перенаправления:
> filename
.
Комментарии:
1. бесполезный cat бесполезен. egrep может принимать аргумент file. также регулярное выражение не подтверждает требуемый вывод, в частности, последний