Найти слова, которые содержат только 3 символа, используя SED в файле

Решением было использовать dracut с соответствующими сетевыми флагами. В учебнике RHEL6 эти флаги не включены, когда речь идет о корне nfs, поэтому я не знал о них. Вкратце о ключевых шагах, сделанных для выполнения установки root nfs с помощью RHEL6, следует:

#Install dracut-network on RHEL6 (The Host Machine)
 yum install dracut-network –y
#Do a remote root install to the export directory where to nfs root will live.
 yum groupinstall Base --installroot=/export/home/spice/root –y
#Use darcut with nfs flags to 
 dracut -d nfs -d network -f
#Also had to turn off kdump to avoid errors.
 chroot  /export/home/spice/root  chkconfig kdump off

Спасибо, ребята.

0
22.10.2018, 21:32
4 ответа

sed — это потоковый редактор, то есть он читает текст, редактирует его и выводит результат. Не обязательно работать с файлами, только с потоками текста. (В вашем случае поток текста поступает из файла, так что практической разницы нет.)

Используя sed, у вас есть несколько вариантов

  1. Удалите все строки, в которых нет ровно трех последовательных строчных букв, оставив остальные для пропуска через (и вывода ).
  2. Печатать только строки, содержащие ровно три строчные буквы подряд.

В любом случае вам нужно убедиться, что перед тремя стоит пробел, а после них ничего нет.

Будет найдено совпадение слов из четырех (или более )символов и удалена совпадающая строка. Обратите внимание, что мы не связываем концы последовательности, поэтому они будут удачно совпадать в середине более длинной последовательности

sed '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' animals

Это будет работать с файлом как указано, но не принимает во внимание возможность того, что могут быть животные двух (или даже только одной )буквы. (Подумайте, например, о быке ). Так что нам нужно их выбить. На этом этапе нам нужно сообщить sed, что к каждой строке по очереди нужно применить несколько операций. Нам также необходимо ввести новый символ $, указывающий, что регулярное выражение должно быть привязано к концу -строки -:

.
  • Если мы находим четыре символа подряд, удаляем строку
  • Если мы находим пробел, две буквы, а затем заканчиваем -строки -, удаляем строку
  • Если мы находим пробел, одну букву, а затем заканчиваем -строки -, удаляем строку

Это можно записать в длинной форме следующим образом:

sed -e '/[[:lower:]][[:lower:]][[:lower:]][[:lower:]]/d' -e '/ [[:lower:]][[:lower:]]$/d' -e '/ [[:lower:]]$/d' animals

Если у вас есть подходящая версия sed, вы можете свернуть ее в более удобочитаемую форму. (Найдите флаг -r.)

1
28.01.2020, 02:41

Я использую sed (GNU sed) 4.2.2и получил желаемый результат:

sed 's/^[[:digit:]]\{2\}[[:punct:]][[:space:]]\([[:lower:]]\{3\}\)/\1/gm' animals.txt | sed '/[[:lower:]]\{4\}/d'

Он выполняет следующие шаги:

  1. Найдите строки, начинающиеся с двух цифр, за которыми следует знак препинания ("." ), пробел, а затем слово, состоящее не менее чем из 3 символов нижнего регистра;
  2. В этой строке выберите группу совпадающих символов нижнего регистра;
  3. Используя результат предыдущего шага, удалите слова, содержащие 4 или более символов нижнего регистра.

На выходе есть только слова, содержащие ровно 3 символа нижнего регистра:

cow
dog
fox
pig
rat
yak

Для справки, GNU sed использует этот синтаксис регулярного выражения .

0
28.01.2020, 02:41

Самый простой способ сделать это примерно так:

$ sed -n '/^....[a-z]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

Чтобы выполнить требование, которое вы используете [[:lower:]], вы можете изменить вышеприведенное следующим образом:

$ sed -n '/^....[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

Вы также можете отключить ....для последовательности с явно заданным размером:

$ sed -n '/^.\{4\}[[:lower:]]\{3\}$/p' animals
03. cow
04. dog
06. fox
16. pig
18. rat
25. yak

Ссылки

0
28.01.2020, 02:41

Вы были близки. Основная идея сопоставления 3 элементов находится в правильном направлении.

Синтаксическая ошибка для BRE заключается в том, что для {}требуется обратная косая черта (или используется-E).

Тем не менее, ваше регулярное выражение:[[:lower:]]\{3\}будет соответствовать любому, содержащему три или более символов.

Вам нужно привязать регулярное выражение, возможно, отspace(end($):

$ <infile sed -n '/ [[:lower:]]\{3\}$/p'

Обратите внимание, что команда не будет распечатываться по умолчанию и pбудет напечатана только в совпадающих строках. Это можно было бы написать наоборот:

$ <infile sed '/ [[:lower:]]\{3\}$/!d'

То есть :печатать по умолчанию, в строках не совпадающих , удалить их(d).

Или вы можете использовать границы слов:

$ <infile sed '/\b[[:lower:]]\{3\}\b/!d'

Или:

$ <infile sed '/\<[[:lower:]]\{3\}\>/!d'

И, возможно, использовать регулярное выражение ERE:

$ <infile sed -E '/\b[[:lower:]]{3}\b/!d'

Если вам нужны только названия животных, используйте:

$ <infile sed -E '/.*\<([[:lower:]]{3})\>/!d;s//\1/'
cow
dog
fox
pig
rat
yak
0
28.01.2020, 02:41

Теги

Похожие вопросы