Как к grep словам от единственного сопоставления строк шаблон?

Будет любой вести меня к grep только слова, содержащие шаблон _ARA от ниже единственной строки.

Строка:

LINK:['IM219MIR_ARA1','IM18Q4_ARA1','SM18Q4_ARA1','IM18PLANNING_ARA1','IM118Q4DYNVA_ARA1','IM218Q4DYNVA_ARA1','IM119EIOPALTG_ARA1','IM219EIOPALTG_ARA1','SM119EIOPALTG_ARA1']}

Ожидаемый вывод:

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1
6
задан 25 November 2019 в 17:59

2 ответа

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

grep -ow '\w*_ARA\w*'

В этом случае можно на самом деле опустить -w опция, если Вы любите и получаете тот же результат, начиная с регулярного выражения здесь, явно соответствует только словесным символам \w.

Это будет читать из стандартного входа, потому что нет никаких аргументов имени файла. Если текст, который Вы показали, находится в файле - говорят, названный input.txt- затем Вы передали бы это как аргумент:

grep -ow '\w*_ARA\w*' input.txt

Это производит:

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1

Технически, вывод это, продукты немного отличаются от того, что Вы показали в своем вопросе, потому что ожидаемый вывод Вы показали списки IM119EIOPALTG_ARA1 дважды, даже при том, что это появляется только однажды в тексте, Вы показали. Я предполагаю, что это - ошибка, и Вы на самом деле хотите ее только однажды.

9
ответ дан 21 December 2019 в 23:50

Если Вы хотите использовать cut и sed команды, используйте это:

<test.txt cut -d'[' -f2 | cut -d']' -f1 | sed "s/,'/\\n/g" | sed 's/.$//' | cut -d\' -f2 | grep _ARA

Объяснение в 2 частях:

  • grep _ARA нашел бы строки, которые должны быть фильтрованы
  • cut -d'[' -f2 удалит символы перед Вашими словами, тем же для cut -d']' -f1 который удалил бы то, что после
  • sed "s/,'/\\n/g" извлечет каждое слово в одной строке
  • <test.txt просто перенаправление для cut и grep команда

После этого 4 предыдущих команды результат:

'IM219MIR_ARA1'
IM18Q4_ARA1'
SM18Q4_ARA1'
IM18PLANNING_ARA1'
IM118Q4DYNVA_ARA1'
IM218Q4DYNVA_ARA1'
IM119EIOPALTG_ARA1'
IM219EIOPALTG_ARA1'
SM119EIOPALTG_ARA1'

Так, для удаления ' в конце каждого слова добавляем мы

sed 's/.$//'

и для 1rst ', мы используем

cut -d\' -f2

Таким образом, конечный результат:

IM219MIR_ARA1
IM18Q4_ARA1
SM18Q4_ARA1
IM18PLANNING_ARA1
IM118Q4DYNVA_ARA1
IM218Q4DYNVA_ARA1
IM119EIOPALTG_ARA1
IM219EIOPALTG_ARA1
SM119EIOPALTG_ARA1

Если Вы хотите больше деталей об этой команде, можно считать мое обсуждение с Eliah Kagan.

4
ответ дан 21 December 2019 в 23:50

Другие вопросы по тегам:

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