Получить текст за словом в определенной позиции - PullRequest
0 голосов
/ 14 января 2019

У меня есть файл, подобный этому

TT;12-11-18;text;abc;def;word
AA;12-11-18;tee;abc;def;gih;word
TA;12-11-18;teet abc;def;word
TT;12-11-18;tdd;abc;def;gih;jkl;word

Я хочу вывод, как этот

TT;12-11-18;text;abc;def;word
TA;12-11-18;teet abc;def;word

Я хочу получить word, если это произойдет в позиции 5 после даты 12-11-18. Я не хочу, чтобы это произошло, если оно найдено после этой позиции, которая находится на 6-й или 7-й позиции. Отсчет позиции начинается с даты 12-11-18 Я хочу попробовать эту команду

cat file.txt|grep "word" -n1

Распечатывает все случаи, в которых этот шаблон word совпадает. Как мне решить мою проблему?

1 Ответ

0 голосов
/ 14 января 2019

Попробуйте это (GNU awk):

awk -F"[; ]" '/12-11-18/ && $6=="word"' file

или sed один:

sed -n '/12-11-18;\([^; ]*[; ]\)\{3\}word/p' file

Или grep с в основном тем же регулярным выражением (другой escape):

grep -E "12-11-18;([^; ]*[; ]){3}word" file

[^; ] означает любой символ, который не ; или (пробел).
* означает совпадение с любым повторением предыдущего персонажа / группы.
- [^; ]* означает любую строку длины, которая не содержит ; или пробела, ^ в [^; ] - отрицание.

[; ] означает ; или пробел, либо один вхождение.
() состоит в том, чтобы сгруппировать вышеперечисленные вместе.
{3} соответствует трем повторениям прежнего персонажа / группы.

В целом ([^; ]*[; ]){3} означает ; / разделенные пробелом три поля, включая разделители.

Как указывает @kvantour, если в одном месте может быть несколько пробелов, они могут быть неисправными.
Чтобы рассмотреть несколько пробелов как один разделитель, тогда:

awk -F"(;| +)" '/12-11-18/ && $6=="word"'

и

grep -E "12-11-18;([^; ]*(;| +)){3}word"

или GNU sed (posix / bsd / osx sed не поддерживает |):

sed -rn '/12-11-18;([^; ]*(;| +)){3}word/p'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...