игнорировать пробелы в / вокруг скобок для подсчета случаев - PullRequest
0 голосов
/ 01 июня 2018

(для пользователей LaTeX) Я хочу найти элементы, помеченные вручную

(к кому это может относиться) файл сценария на GitHub

Я пытался найти решение, но то, что я нашел, предложило сначала удалить пробелы.В моем случае, я думаю, должно быть более простое решение.Это может быть использование grep или awk или другого инструмента.

Рассмотрим следующие строки:

\item[a)] some text
\item [i) ] any text
\item[ i)] foo and faa
\item [   1) ] foo again

Я хочу найти (или подсчитать), если есть предметы содинарные ) внутренние скобки.Формат может содержать пробелы в скобках и / или вокруг него.Кроме того, символом перед закрывающими скобками может быть любая буква или цифра.

Редактировать: Я пытался grep "\[a)\]", но пропустил [ a) ].Поскольку существует множество возможных способов написания элемента, я не могу определиться с возможным шаблоном.Я думаю, что мне достаточно, например,

\item<blank spaces>[<blank spaces><letter or number>)<blank spaces>]

Заменить пробел не может работать, потому что шаблон выше вообще содержит текст вокруг него (например: \item[ a)] consider the function...)

Вывод должен указать, есть ли такие шаблоны или нет.Это может быть ноль или число вхождений.

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Итак, чтобы сделать все это в самом grep:

grep -c -E '\\item\s*\[\s*\w+\)\s*\]' file.txt

Обратите внимание на все проверки \s* для пробелов.Также -c, чтобы получить счет.

Разбить его:

\\       a backslash (needs escape in grep)
item     "item"
\s*      optional whitespaces
\[       "[" (needs escape in -E)
\s*      optional whitespaces 
\w+      at least one 'word' char
\)       ")" (needs escape in -E)
\s*      optional whitespaces 
\]       "]" (needs escape in -E)
0 голосов
/ 01 июня 2018

После awk также может помочь здесь (я просто убираю пробелы между [ до ] и затем ищу в нем комбинацию из цифры или символа.

awk '
match($0,/\[.*\]/){
  val=substr($0,RSTART+1,RLENGTH-1);
  gsub(/[[:space:]]+/,"",val);
  if(val ~ /[a-z0-9]+\)/){  count++  }
}
END{
  print count
}'  Input_file
0 голосов
/ 01 июня 2018

Итак, я думаю что-то вроде этого:

tr -d " \t" < file.txt | grep -c '\\item\[[0-9A-Za-z])\]'

Это подсчитает количество совпадений для вас.

Редактировать: Добавлено \t к вызову tr.Теперь удаляет все пробелы и символы табуляции.

Вот версия только для grep.Это может быть полезно для распечатки всех совпадений (путем удаления -c), так как вышеприведенная версия изменяет ввод:

grep -c '\\item *\[ *[0-9A-Za-z]) *\]' file.txt

Вот более универсальный ответ, если это то, что вы ищете.Здесь мы выводим совпадения в файл и подсчитываем количество строк в файле, чтобы получить количество совпадений ...

grep '\\item *\[ *[0-9A-Za-z]) *\]' file.txt > matches.txt
wc -l < matches.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...